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

PL/SQL Oracle Discussion :

TRIGGER BEFORE INSERT


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut TRIGGER BEFORE INSERT
    Bonjour,

    je dois créer un trigger qui me permet de renseigner un champ supplémentaire dans la ligne que je dois inserer.

    Pb : il ne connaît pas la variable new.

    Une idée. Voici le code

    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
    CREATE or REPLACE TRIGGER SET_SRV_LVL_ON_INC
    BEFORE INSERT
        ON INCIDENT
    DECLARE
       srv_level QTABLE.QT_DES%TYPE;
    BEGIN
        IF new.ASSET_EQUIPEMENT IS NOT NULL THEN
    		SELECT QT_DES INTO srv_level
    	 	FROM
    	    		POSTE_DE_TRAVAIL T1, QTABLE T2
    	 	WHERE 
    			LTRIM(RTRIM(T1.CHPAR11))=LTRIM(RTRIM(T2.QT_CODE(+))) AND
    			T1.CODE_W = new.ASSET_EQUIPEMENT;
    	    IF srv_level IS NOT NULL THEN
    		   new.COMP_FIELD65 := srv_level;
    	    END IF;
        END IF;
    END;
    Merci.

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,
    La bonne syntaxe n'est pas new.ASSET_EQUIPEMENT (par ex.), mais :new.ASSET_EQUIPEMENT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut
    J'ai testé et voilà les erreurs que j'obtiens

    A partir de SQL+
    ERREUR à la ligne 1 :
    ORA-04082: références NEW ou OLD interdites dans déclencheurs niveau table

    ou lorsque je passe par OEM
    Paramètre IN ou OUT absent dans l'index ::1

    Merci

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    La recherche est ton amie.


    Le problème est tout autre : vous avez fait un statement trigger et non un row trigger !
    il faut rajouter "FOR EACH ROW" pour que les variables :NEW et :OLD aient un sens !

    Si on fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE inscription SET ..  WHERE ...
    Et que l'ordre ci-dessus impacte 5000 lignes, un trigger "FOR EACH ROW" sera appellé 5000 fois, tandis qu'un statement trigger ne sera appellé qu'une seule fois car il n'y a eu qu'une seule instruction.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut
    Ce que je souhaites faire c'est seulement controler la ligne que je veux insérer.
    Comment accéder aux données dans ce cas alors?

    Merci

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Je viens de vous donner la réponse, un trigger "FOR EACH ROW".

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut
    Ok, merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut
    Je viens de tester le code suivant :

    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
    CREATE or REPLACE TRIGGER SET_SRV_LVL_ON_INC
    BEFORE INSERT
        ON INCIDENT
    FOR EACH ROW
    DECLARE
       srv_level QTABLE.QT_DES%TYPE;
    BEGIN
        IF :new.ASSET_EQUIPEMENT IS NOT NULL THEN
    		SELECT QT_DES INTO srv_level
    	 	FROM
    	    		POSTE_DE_TRAVAIL T1, QTABLE T2
    	 	WHERE 
    			LTRIM(RTRIM(T1.CHPAR11))=LTRIM(RTRIM(T2.QT_CODE(+))) AND
    			T1.CODE_W = :new.ASSET_EQUIPEMENT;
    	    IF srv_level IS NOT NULL THEN
    		   :new.COMP_FIELD65 := srv_level;
    	    END IF;
        END IF;
    END;
    Compile à partir de SQL+ mais pas dans OEM.
    En tout cas mon application plante au moment de l'insertion.
    Une idée pour mettre à jour le champ COMP_FIELD65 ?

    Merci

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Quel est le message d'erreur?

  10. #10
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Citation Envoyé par sfoggy Voir le message
    En tout cas mon application plante au moment de l'insertion.
    Un message d'erreur peut-être pour qu'on puisse éventuellement avoir une idée?

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Vous faites un SELECT INTO sans gérer d'exception. Vu que vous testez la nullité de srv_level, si la requête précédente ne ramène rien, le trigger plante.
    Il faut ajouter une exception.

    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
    CREATE OR REPLACE TRIGGER set_srv_lvl_on_inc
       BEFORE INSERT
       ON incident
       FOR EACH ROW
    DECLARE
       srv_level   qtable.qt_des%TYPE;
    BEGIN
       IF :NEW.asset_equipement IS NOT NULL
       THEN
          BEGIN
             SELECT qt_des
               INTO srv_level
               FROM poste_de_travail t1, qtable t2
              WHERE LTRIM (RTRIM (t1.chpar11)) = LTRIM (RTRIM (t2.qt_code(+)))
                AND t1.code_w = :NEW.asset_equipement;
     
             IF srv_level IS NOT NULL
             THEN
                :NEW.comp_field65 := srv_level;
             END IF;
          EXCEPTION
             WHEN NO_DATA_FOUND
             THEN
                -- srv_level est null
          END;
       END IF;
    END;

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut
    Voilà,

    ORA-04098: Déclencheur 'QPOPE.ONERA_SET_SRV_LVL_ON_INC' non valide.

    Trigger non compilé .

    Merci

  13. #13
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Sous SQL+, au moment de la compilation, il a du vous dire que le trigger était créé avec des erreurs de compilation. Pour avoir ces erreurs, après la compilation du trigger, lancer la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW ERROR TRIGGER QPOPE.ONERA_SET_SRV_LVL_ON_INC

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 80
    Par défaut
    Non, aucun message d'erreur n'est affiché au moment de la création


    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
    SQL> CREATE or REPLACE TRIGGER SET_SRV_LVL_ON_INC
      2  BEFORE INSERT
      3      ON INCIDENT
      4  FOR EACH ROW
      5  DECLARE
      6     srv_level QTABLE.QT_DES%TYPE;
      7  BEGIN
      8      IF :new.ASSET_EQUIPEMENT IS NOT NULL THEN
      9    SELECT QT_DES INTO srv_level
     10     FROM
     11         POSTE_DE_TRAVAIL T1, QTABLE T2
     12     WHERE 
     13     LTRIM(RTRIM(T1.CHPAR11))=LTRIM(RTRIM(T2.QT_CODE(+))) AND
     14     T1.CODE_W = :new.ASSET_EQUIPEMENT;
     15       IF srv_level IS NOT NULL THEN
     16       :new.COMP_FIELD65 := srv_level;
     17       END IF;
     18      END IF;
     19  END;
     20  /
    Déclencheur créé.


    Merci.

Discussions similaires

  1. [10g] Trigger before insert
    Par Lung dans le forum Oracle
    Réponses: 6
    Dernier message: 21/12/2007, 16h22
  2. Trigger Before Insert et Before Update
    Par NicoNours dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 14/08/2007, 10h20
  3. Trigger : Before insert
    Par guitou0 dans le forum Développement
    Réponses: 6
    Dernier message: 29/06/2007, 11h39
  4. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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