Bonjour à tous,
J'ai récemment eu une erreur "ora-01000 maximum open cursors exceeded", comme proposé dans les actions, j'ai augmenté le nombre "open cursor" afin de ne pas être bloqué. La version d'Oracle est une Expression Edition 10g.
Par curiosité, j'ai essayé d'identifier approximativement combien d"open cursor" était ouver part Oracle pour la suppression d'une seule ligne. J'en ai eu env. 333.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 -- Depuis une session SYS SQL> show parameters open NAME TYPE VALUE ------------------------------------ ----------- ------- open_cursors integer 300 -- Depuis l'utilisateur SQL> delete int_utilisateur where id = 43; delete int_utilisateur where id = 43 * ERROR at line 1: ORA-01000: maximum open cursors exceeded -- Depuis une session SYS SQL> alter system set open_cursors=500 scope=both; System altered. SQL> show parameters open NAME TYPE VALUE ------------------------------------ ----------- ------- open_cursors integer 500 -- Depuis l'utilisateur (nouv. session) SQL> delete int_utilisateur where id = 43; 1 row deleted.
Ma suppression n'étant lié qu'à une ligne je ne m'attends pas à voir autant de curseur ouvert. Il y a bien des tables (35 en tout) lié avec la règle "DELETE ON CASCADE" et aucunes de ces tables ne contiennent de valeur pour l'ID en question.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 -- Requête utilisé durant la suppression pour estimer le nombre de curseurs select sum(a.value) total_cur, avg(a.value) avg_cur, max(a.value) max_cur, s.username, s.machine from v$sesstat a, v$statname b, v$session s where a.statistic# = b.statistic# and s.sid=a.sid and b.name = 'opened cursors current' group by s.username, s.machine order by 1 desc;
Ma question est comment Oracle gére les curseurs? Y a-t-il des informations à ce sujet ou doit-on simplement appliquer la régle d'augmenter la limite des "open cusors"?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 -- Requete pour identifier les tables liés SELECT 'SELECT COUNT(*) FROM ' || CONS.TABLE_NAME || ' WHERE ' || CONS_COL.COLUMN_NAME || ' = 43;' FROM USER_CONSTRAINTS CONS, USER_CONSTRAINTS PAR, USER_CONS_COLUMNS CONS_COL WHERE CONS.R_CONSTRAINT_NAME = PAR.CONSTRAINT_NAME AND CONS.CONSTRAINT_NAME = CONS_COL.CONSTRAINT_NAME AND CONS.OWNER = 'ID_FILSEK_DEMO' AND CONS.OWNER = PAR.OWNER AND CONS.OWNER = CONS_COL.OWNER AND PAR.TABLE_NAME = 'INT_UTILISATEUR' AND CONS.DELETE_RULE = 'CASCADE' ORDER BY CONS.TABLE_NAME;
D'avance merci de vos réponses avisées.
Meilleures salutations,
Cédric
Partager