IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

[Trigger] -recursivité before|after insert


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut [Trigger] -recursivité before|after insert
    Désidément bc de pb aujourd'hui ... mais j'apprends bcp.

    Encore un pb avec mes triggers ; la récursivité.

    Mon problème concerne la duplication d'un enregistrement via un trigger.

    Un article est dédié à ce sujet dans le oracle book d'oracle press (Oracle 8i) mais dans l'exemple cité la duplication se fait sur une base distante via Dblink dans mon cas la duplication est partiel (pas de pb de ce coté la) mais dans la même table. Existe t il une solution pour evité une execution récursive du trigger.

    voila mes triggers ::


    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
    CREATE OR REPLACE TRIGGER TRIG_BRANCARD
    BEFORE INSERT ON BRANCARD 
    FOR EACH ROW 
    DECLARE
    	ROW1 INT;
    BEGIN 
    	SELECT SEQ_BRANCARD.NEXTVAL INTO ROW1 FROM DUAL ;
    	:NEW.NO_BRANC:=ROW1;
    END;
    /
     
    -- Trigger preparent le retour....
    CREATE OR REPLACE TRIGGER TRIG_BRANCARD_PREPRETOUR
    BEFORE INSERT ON BRANCARD 
    FOR EACH ROW 
    DECLARE
    	R1 INT;
    BEGIN 
    	SELECT SEQ_BRANCARD.NEXTVAL INTO R1 FROM DUAL ;	
    	INSERT INTO BRANCARD 
    	(NO_HOP,NO_BRANC,TY_BRANC,DT_TRANS,ID_PATIENT,MD_TRANS) 
    	VALUES 
    	(:new.NO_HOP,R1,'R',:new.DT_TRANS,:new.ID_PATIENT,:new.MD_TRANS) ;
    END;
    /
    voila l'erreur

    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
    ERROR at line 1:
    ORA-00036: maximum number of recursive SQL levels (50) exceeded
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 5
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD'
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD", line 8
    ORA-04088: error during execution


    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
     
    CREATE OR REPLACE TRIGGER TRIG_BRANCARD
    BEFORE INSERT ON BRANCARD 
    FOR EACH ROW 
    DECLARE
    	ROW1 INT;
    	R1 INT;	
    BEGIN 
    	SELECT SEQ_BRANCARD.NEXTVAL INTO ROW1 FROM DUAL ;
    	:NEW.NO_BRANC:=ROW1;
    	SELECT SEQ_BRANCARD.NEXTVAL INTO R1 FROM DUAL ;	
    	INSERT INTO BRANCARD 
    	(NO_HOP,NO_BRANC,TY_BRANC,DT_TRANS,ID_PATIENT,MD_TRANS) 
    	VALUES 
    	(:new.NO_HOP,R1,'R',:new.DT_TRANS,:new.ID_PATIENT,:new.MD_TRANS) ;
    END;
    /
    voila l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning: Entry/Exit code is optimized.  Cannot restore context (UNWIND 22)
    ORA-03113: end-of-file on communication channel
    une idée...

    merci d'avance && merci pour votre grande réactivité constatée lors de mes précédents posts

  2. #2
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut
    pas d'idée ??

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Il est normal que tu aies un problème de récursivité infinie en faisant un INSERT dans la table sur laquelle porte le TRIGGER ON INSERT !
    Si le besoin est avéré, tu peux ajouter une colonne technique à ta table, qui sera toujours NULL pour les INSERT fonctionnels et que tu forces à une valeur quelconque dans le INSERT qui est dans le TRIGGER, et bien sur, le TRIGGER ne fait d'INSERT que si cette colonne est NULL.

    Mais je pense que la meilleure solution serait de revoir la conception de cet enchaînement qui me paraît "bizarre".

  4. #4
    Membre éclairé Avatar de jacquesh
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2005
    Messages : 269
    Par défaut
    bon, j'essai de revoir le fonctionnement logique de tout ca ...

    cependant je n'arrive pas a comprendre le trigger AFTER INSERT ??

    pour le BEFORE INSERT j'ai cru comprendre que :NEW.val recupère la valeur du champ 'val' qui va être inséré :: c bien ca ?

    peut on faire référence aux valeurs des champs insérés qui on provoqué le trigger. (dans le cas d'un after insert)

    INSERT INTO XXX VALUES ('A",'b','C') ;

    le trigger se lance APRES l'insertion mais j'ai besoin de 'A' pour mon PL/SQL peut on le recupéré ?? & Comment ?

    merci.

Discussions similaires

  1. Conception TRIGGER before OU after insert
    Par cyril dans le forum PL/SQL
    Réponses: 2
    Dernier message: 07/12/2011, 10h42
  2. [Trigger/table mutante] before ou after INSERT?
    Par rvfranck dans le forum PL/SQL
    Réponses: 0
    Dernier message: 16/10/2008, 19h05
  3. Un Trigger After INSERT peut-il empêcher l'INSERT ?
    Par cian2006 dans le forum Oracle
    Réponses: 3
    Dernier message: 13/09/2006, 17h27
  4. Simple Trigger before on insert.
    Par gregb34 dans le forum Oracle
    Réponses: 7
    Dernier message: 28/05/2006, 07h27
  5. Trigger after insert, sans each row, possible ??
    Par veenie dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2006, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo