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.

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.
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
 
-- 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 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
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;
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"?

D'avance merci de vos réponses avisées.

Meilleures salutations,

Cédric