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 :
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);
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.

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 :

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);
Merci pour votre aide