[Oracle triggers] - mutating table > j'm'arrache les ch'veux

- mutating table > j'm'arrache les ch'veux [Oracle triggers] - SQL/NoSQL - Programmation

Marsh Posté le 16-11-2004 à 11:31:23    

jour'
 
mon probleme : j'ai une table fonctions qui contient des fonctions et des meta fonctions (fonctions de fonctions).
 
quand on modifie la propriété acces_internet de la meta fonction, ca doit mettre a jour l'acces internet des fonctions filles.
 
donc je fais mon trigger after insert sur la colonne et la....
 
- je suis passé pour le trigger > ca chie
- trigger qui appelle une procédure > ca chie
 
sachant qu'en méthodes j'ai essayé d'utiliser :  
- le pragma autonomous_transaction
- l'ignorage de l'exception.
 
mon dernier bout de code ressemble a ca :  (le trigger ne fait qu'appeller cette procédure) et bien évidemment, ca marche pas :/ (ca modofie qu'une ligne, ou alors rien du tout etc....)
 

Code :
  1. (cle_fi_fct in number)
  2. as
  3. /*pragma autonomous_transaction;*/
  4.   cursor curs_find_nodes (param1 number) is select cle_fi, acces_inter, acces_inter_calcule from info.fonction_info where cle_fi in
  5.    (select cle_fi_meta from info.rel_fonct_meta where cle_fi in
  6.     (select cle_fi from info.rel_fonct_meta where cle_fi_meta = param1)
  7.    );
  8.    rowItem curs_find_nodes%rowtype;
  9.    acces_inter number := 0;
  10.    cle_fi_p number := 0;
  11.    cursor curs_sons (param2 number) is select cle_fi from rel_fonct_meta where cle_fi_meta = param2;
  12.    TABLE_MUTANTE EXCEPTION;
  13.    PRAGMA EXCEPTION_INIT(TABLE_MUTANTE, -4091); 
  14.  
  15. begin
  16.   open curs_find_nodes(cle_fi_fct);
  17.   loop
  18.     fetch curs_find_nodes into rowItem;
  19.     exit when curs_find_nodes%notfound;
  20.     if rowItem.acces_inter = -1 or rowItem.acces_inter_calcule = -1 then
  21.       acces_inter := -1;
  22.     end if;
  23.   end loop;
  24.   close curs_find_nodes;
  25.   open curs_sons(cle_fi_fct);
  26.   loop
  27.     fetch curs_sons into cle_fi_p;
  28.     exit when curs_sons%notfound;
  29.     DBMS_OUTPUT.PUT_LINE('update info.fonction_info set acces_inter_calcule =' + acces_inter + 'where cle_fi =' + cle_fi_p);
  30.     update info.fonction_info set acces_inter_calcule = acces_inter where cle_fi = cle_fi_p;
  31.    /* P_ACCES_INTER(cle_fi_p);*/
  32.   end loop;
  33.   close curs_sons;
  34.  
  35.     EXCEPTION
  36.         WHEN TABLE_MUTANTE THEN
  37.         DBMS_OUTPUT.PUT_LINE('Fausse alerte'); 
  38.   /*RAISE_APPLICATION_ERROR(-20000, 'suppression interdite');*/
  39. end;

Reply

Marsh Posté le 16-11-2004 à 11:31:23   

Reply

Marsh Posté le 16-11-2004 à 15:29:03    

c'est normal que tu te tapes cette erreur: ton trigger, qui se déclenche sur des insert dans une table A, fait lui meme des select sur cette meme table A.
Pour t'en sortir et éviter cette erreur classique de table en mutation, soit tu réécris ton trigger (si c'est possible), soit tu passes par des tables intermédiaires.

Reply

Marsh Posté le 16-11-2004 à 15:41:37    

ben le probleme c'est la recursivité sur une meme table.
 
donc reecrire le trigger > pour mettre quoi dedans ?
tables intermédiaires > pour naviguer en permanence entre deux tables ? :/

Reply

Marsh Posté le 16-11-2004 à 15:47:51    

il ressemble à quoi ton trigger ?

Reply

Marsh Posté le 16-11-2004 à 17:21:28    

il appelle juste la procédure collée au dessus.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed