Migration Oracle 11 : Problème table mutante
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:
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:
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