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 :

[PL/SQL] Creation de triggers dans transaction


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut [PL/SQL] Creation de triggers dans transaction
    Mon probleme est le suivant j'ai trois requetes permettant de creer des triggers. J'aimerais les executer dans une meme transaction.

    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
    28
    29
    30
    31
    32
     
    BEGIN
     
     
    CREATE OR REPLACE TRIGGER TMO_ACTEUR_REPONSE_LISTE
    AFTER UPDATE
    OF NOM_MO_ACTEUR
    ON MO_ACTEUR
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN	 		
      DECLARE CURSOR C_DOCUMENT IS
      SELECT ID_MO_DOCUMENT FROM MO_REPONSE_LISTE
      WHERE  :NEW.ID_MO_ACTEUR = MO_REPONSE_LISTE.IDINTERNAUTE;
      BEGIN
      FOR R_DOCUMENT IN C_DOCUMENT LOOP
      UPDATE MO_REPONSE_LISTE
      SET MO_REPONSE_LISTE.NOMINTERNAUTE = :NEW.NOM_MO_ACTEUR
      WHERE MO_REPONSE_LISTE.ID_MO_DOCUMENT =          R_DOCUMENT.ID_MO_DOCUMENT;
       END LOOP;
       END;			
    END;
     
     ...
     
    COMMIT;
     
    EXCEPTION
    	WHEN OTHERS THEN ROLLBACK;
    END;
    /
    EXIT
    Le code ci dessus correspond a mon script sql contenant une des requetes de creation de triggers. Quand je lance ce script il me met une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SP2-0552 : Variable de lien "NEW" non déclarée
    Si vous avez une idée ca serait bien sympa.Merci d'avance

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Pour etre plus précis mon veritable probleme est que dans cette transaction je vais faire appel a une requete qui va remplir une table venant d'etre créée.Et je ne veux pas que pendant le temps du remplissage, un trigger se declenche a cause d'une action d'un internautre.... J'aimerais que cela soit "commité" quand toutes les opérations sont terminées

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il n'est pas possible d'utiliser les ordres du DDL dans le PL/SQL. Il faut utiliser l'instruction execute immediate.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    en fait je faisais appel comme ca aussi mais ca revient au meme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    BEGIN
    	/*Ajout des triggers*/
    	@Triggers/TMO_DOCUMENT_REPONSE_LISTE.trg;	
    COMMIT;
    EXCEPTION
    	WHEN OTHERS THEN ROLLBACK;
    END;
    je vais essayer ce que tu me dis quand j'aurais trouvé comment l'utiliser

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    pb resolu merci beaucoup

    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
     
    BEGIN
    	/*Ajout des triggers*/
    	--@Triggers/TMO_DOCUMENT_REPONSE_LISTE.trg;
    	EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER TMO_DOCUMENT_REPONSE_LISTE'||
    					  'AFTER UPDATE OF TITRE_MO_DOCUMENT ON MO_DOCUMENT REFERENCING NEW AS NEW OLD AS OLD'||
    					  'FOR EACH ROW'||
    					  'BEGIN'||
    	 				  '		DECLARE CURSOR C_DOCUMENT IS'||
    					  '		SELECT ID_MO_DOCUMENT,TITRE_MO_DOCUMENT FROM MO_REPONSE_LISTE'||
    					  '		WHERE  NEW.ID_MO_DOCUMENT = MO_REPONSE_LISTE.ID_MO_DOCUMENT;'||
    					  '		BEGIN'||
    					  '			FOR R_DOCUMENT IN C_DOCUMENT LOOP'||
    		 			  '				UPDATE MO_REPONSE_LISTE'||
    					  '				SET MO_REPONSE_LISTE.TITRE_MO_DOCUMENT = NEW.TITRE_MO_DOCUMENT'||
    				      '				WHERE MO_REPONSE_LISTE.ID_MO_DOCUMENT = R_DOCUMENT.ID_MO_DOCUMENT;'||
    					  '			END LOOP;'||
    				      '		END;'||
    					  'END;';
     
     
     
     
    COMMIT;
    EXCEPTION
    	WHEN OTHERS THEN ROLLBACK;
    END;

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    tu veux bien nous expliquer l'intérêt d'une telle manipulation pour le moins originale ?

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    ben l'interet est expliqué dans mes premiers posts.Et si je pouvais faire plus simple je le ferais!! Mais j'ai encore un probleme je mets deux execute immediate a la suite, seul le premier est executé et les autres sont ignorés ,d'ailleurs les programme se termine...?????

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Fred_D
    tu veux bien nous expliquer l'intérêt d'une telle manipulation pour le moins originale ?
    Bon ok pour etre plus precis, dans mon script je cree une table.Les triggers qui vont etre crées vont remplir cette table.Cependant apres la creation des triggers j'ai une autre procedure qui va elle aussi remplir cette table ou plutot mettre a jour a partir de données deja existantes. Les triggers ont pour role d'entretenir la coherence du contenu de la table pour les futures actions.

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par globeriding
    ben l'interet est expliqué dans mes premiers posts.Et si je pouvais faire plus simple je le ferais!! Mais j'ai encore un probleme je mets deux execute immediate a la suite, seul le premier est executé et les autres sont ignorés ,d'ailleurs les programme se termine...?????
    Peut-être saute t-il dans la section exception suite à une erreur ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    j'voudrais bien parier qu'à la 1° ligne qui déclenche le trigger ça marche et la deuxiéme ligne provoque une erreur parce que la table créée par le trigger existe déjà

    L'usage des triggers ne me parait pas du tout adapter... pourquoi ne pas lancer le create table dans le script initial ?

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Non ce n'est pas les triggers qui lancent la création de la table, ils ne font que des update sur la table. Mais en fait il ne rentre meme pas dans le premier execute immediate...

  12. #12
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Pour résumer est il possible de créer un trigger dans une transaction?

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par globeriding
    Pour résumer est il possible de créer un trigger dans une transaction?
    La réponse a déja été donnée. Il est possible de créer un objet dans un bloc Pl/Sql il suffit pour cela de le mettre dans un execute immediate.

    Etes vous sur de l'ordre pour les triggers suivants .

  14. #14
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    oui en fait il passe dans le bloc d'exception pke si je l'enleve

    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
     
    BEGIN
    	EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||
    					  'TMO_DOCUMENT_REPONSE_LISTE'||
    					  'AFTER UPDATE OF TITRE_MO_DOCUMENT ON MO_DOCUMENT REFERENCING NEW AS NEW OLD AS OLD'||
    					  'FOR EACH ROW'||
    					  'BEGIN'||
    	 				  '		DECLARE CURSOR C_DOCUMENT IS'||
    					  '		SELECT ID_MO_DOCUMENT,TITRE_MO_DOCUMENT FROM MO_REPONSE_LISTE'||
    					  '		WHERE  NEW.ID_MO_DOCUMENT = MO_REPONSE_LISTE.ID_MO_DOCUMENT;'||
    					  '		BEGIN'||
    					  '			FOR R_DOCUMENT IN C_DOCUMENT LOOP'||
    		 			  '				UPDATE MO_REPONSE_LISTE'||
    					  '				SET MO_REPONSE_LISTE.TITRE_MO_DOCUMENT = NEW.TITRE_MO_DOCUMENT'||
    				      '				WHERE MO_REPONSE_LISTE.ID_MO_DOCUMENT = R_DOCUMENT.ID_MO_DOCUMENT;'||
    					  '			END LOOP;'||
    				      '		END;'||
    					  'END;'||
    					  '/';
     
    END;
    Il me met une erreur Begin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN
    *
    Erreur à la ligne 1:
    ORA-00972 : L'identificateur est trop long
    ORA-06512 : à ligne 2
    Ma syntaxe n'est peut etre pas bonne...

  15. #15
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Le nom du trigger est trop long ...

  16. #16
    Membre à l'essai
    Inscrit en
    Avril 2003
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 48
    Points : 16
    Points
    16
    Par défaut
    Non en fait c 'etait bien ma syntaxe, si je mets ma chaine sur une seule ligne sans aucuns retours à la ligne comme dans l'ex précédent ca s'execute quasi correctement.Il trouve juste des erreurs de compilations...

Discussions similaires

  1. [Transact-SQL] Problème avec "execute" dans un "if"
    Par dj_lil dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/12/2007, 15h56
  2. Trigger dans une transaction? Possible?
    Par SuperCed dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 24/08/2007, 17h45
  3. [SQL] récupérer une variable dans un trigger
    Par zekiller3 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/05/2007, 14h48
  4. [PL/SQL] Erreur PLS-00103 dans un trigger
    Par sami.g dans le forum Oracle
    Réponses: 1
    Dernier message: 18/12/2006, 17h57
  5. [PL/SQL] Appel procédure stockée dans trigger
    Par Félia dans le forum Oracle
    Réponses: 3
    Dernier message: 24/01/2005, 17h25

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