Bonjour,
Je rencontre un problème que je n’arrive pas à comprendre suite à la migration d’oracle 10.2.0.4 en 11.2.0.2.
j'ai un traitement que j'ai volontairement simplifié qui insère dans une table TABLE_TEST_CA des lignes qui sont sélectionnées via une fonction F_TEST_CA.
F_TEST_CA sélectionne les lignes dans la table TABLE_TEST_CA et les renvoie par une table type T_TEST_CA_TABLE.
A noter qu’il n’y a aucun trigger, aucune contrainte sur TABLE_TEST_CA.
Je fais ensuite l’insertion :
A l’exécution, j'ai le message d’erreur suivant : ORA-04091 : la table TABLE_TEST_CA est en mutation; le déclencheur ou la fonction ne peut la voir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 insert into TABLE_TEST_CA (child_code , mother_code ) select child_code , mother_code from table(F_TEST_CA);
Le même traitement ne plante pas sur notre base en oracle 10.2.0.4.
Je cherche à savoir quel est le problème. Si vous avez rencontré ce style de problème lors de la migration 11G, je suis intéressée par vos pistes !
Ci-dessous les scripts utilisés pour mon test que vous pouvez exécuter :
Merci pour votre aide
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 /*drop table TABLE_TEST_CA drop type T_TEST_CA_TABLE drop type T_TEST_CA drop function F_TEST_CA*/ create table TABLE_TEST_CA ( child_code varchar2(50 byte), mother_code varchar2(50 byte) ) Insert Into TABLE_TEST_CA values ( '0001015','0253640') -- Definition of type T_TEST_CA create type T_TEST_CA as object (mother_code varchar2(50),child_code varchar2(50)) -- Definition of table type T_TEST_CA_TABLE create type T_TEST_CA_TABLE as table of T_TEST_CA -- Definition of my function F_TEST_CA CREATE OR REPLACE function F_TEST_CA return T_TEST_CA_TABLE as -- Utilisation du table type T_CDC_ENTITY_LINKS_TABLE v_table T_TEST_CA_TABLE:=T_TEST_CA_TABLE(); v_num integer; begin v_num :=0; for rec in (select mother_code, child_code from TABLE_TEST_CA ) loop v_num :=v_num+1; v_table.extend(1); v_table(v_num) := T_TEST_CA(rec.mother_code, rec.child_code); end loop; return v_table; end F_TEST_CA; / -- Insert insert into TABLE_TEST_CA (child_code , mother_code) select child_code , mother_code from table(F_TEST_CA);
Partager