Déclencheur d'INSERTION pour l'insertion d'enregistrement dans le même tableau
J'ai un trigger qui est le feu sur l'insertion d'un nouvel enregistrement dans la table que je veux insérer un nouvel enregistrement dans la même table.
Mon déclencheur est :
create or replace trigger inst_table
after insert on test_table referencing new as new old as old
for each row
declare
df_name varchar2(500);
df_desc varchar2(2000);
begin
df_name := :new.name;
df_desc := :new.description;
if inserting then
FOR item IN (SELECT pid FROM tbl2 where pid not in(1))
LOOP
insert into test_table (name,description,pid) values(df_name,df_desc,item.pid);
END LOOP;
end if;
end;
sa donne une erreur comme
ORA-04091: table TEST_TABLE is mutating, trigger/function may not see it
je pense qu'il m'empêche de les insérer dans la même table.
alors, comment puis-je insérer ce nouveau record à la même table.
Remarque :- je suis à l'aide de Oracle comme base de données
- double possible de Oracle déclenche - problème avec la mutation des tableaux
Vous devez vous connecter pour publier un commentaire.
Mutation se produit toutes les fois que vous avez une ligne de niveau de déclenchement qui modifie la table que vous jouiez sur. Le problème, c'est que l'Oracle ne peut pas savoir comment se comporter. L'insertion d'une ligne, le déclencheur lui-même insère une ligne dans la même table, et Oracle devient confus, la cause, les insertions dans la table grâce à la gâchette, sont-ils soumis à l'action de déclencheur trop?
La solution est un processus en trois étapes.
1.) Déclaration de niveau avant de déclencher qui instancie un paquet qui va garder la trace des lignes à insérer.
2.) Au niveau de la ligne avant ou après le déclenchement qui sauve la ligne des infos sur les variables de package qui ont été instancié dans l'étape précédente.
3.) Déclaration de niveau de déclenchement qui s'insère dans la table, toutes les lignes qui sont enregistrés dans la variable de package.
Un exemple de ceci peut être trouvé ici:
http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
Espère que ça aide.
Je dirais que vous devriez regarder d'une AUTRE manière que les déclencheurs pour atteindre cet objectif. Comme mentionné dans la réponse de Mark Bobak, le déclencheur est l'insertion d'une ligne, puis pour chaque ligne insérée par le déclencheur, alors que les besoins à l'appel de la gâchette pour insérer plusieurs lignes.
Je regarderais soit l'écriture d'une procédure stockée pour créer l'insertion ou il suffit d'insérer via une sous-requête, plutôt que par des valeurs.
Déclencheurs peuvent être utilisés pour résoudre des problèmes simples, mais lors de la résolution de plusieurs problèmes compliqués qu'ils vont juste causer des maux de tête.
Il serait intéressant de lire à travers les réponses à cette double question posté par APC et aussi ces cet article de Tom Kyte. BTW, l'article est également référencé dans la double question, mais le lien est maintenant obsolète.
Bien qu'après se plaindre de la façon dont le mauvais éléments déclencheurs, voici une autre solution.
Peut-être vous avez besoin de regarder, d'avoir deux tables. Insérer les données dans le
test_table
tableau que vous ne le font actuellement. Mais au lieu d'avoir la gâchette insérer des lignes supplémentaires dans letest_table
table, avoir un détail de la table avec les données. Le déclencheur peut ensuite insérer toutes les lignes dans la table de détail.Vous pourriez rencontrer à nouveau la mutation de déclencher d'erreur si vous avez un delete cascade de clé étrangère de la relation entre les deux tables de sorte qu'il peut être préférable de l'éviter.