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 :

[10g] Syntaxe trigger


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut [10g] Syntaxe trigger
    Bonjour à tous,

    Dans une table d'un schema oracle, on souhaite modifier le champ description d'un objet (via un GUI). Seulement on constate que d'autres enregistrements de cette table utilisant la description de cet objet ne sont pas mis a jour automatiquement. D'ou l'idee d'utiliser un trigger. Le probleme tous ces enregistrements sont dans la meme table, du coup le trigger tente d'updater des champs de la table sur lequel il est defini, ce qui donne une erreur ORA-4091: table mutante ... Ci-dessous 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
    create or replace
    TRIGGER un_trigger AFTER UPDATE OF DESCRIPTION ON La_table
    FOR EACH ROW WHEN (NEW.type_id ='007')
    DECLARE
    cursor c_reqId is 
    	SELECT distinct to_number(kr.parameter1) as reqId
    	FROM table2 kr
    	WHERE kr.relation='15'
    	AND kr.source_id= :NEW.REQUEST_ID ;
     
    BEGIN
            FOR cur in c_reqId LOOP
                update La_table kc set description= :NEW.DESCRIPTION where kc.request_id = cur.reqId ;
            END LOOP;
    END;
    Est-ce que l'un de vous aurait une solution ?

  2. #2
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Tu trouveras peut être ton bonheur ici

  3. #3
    Membre expérimenté Avatar de JerryMouse
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 215
    Par défaut
    Tu ne peux pas modifier les données de la table déclenchante avec un ordre SQL.
    Ce que tu peux faire, c'est

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    J'ai tente de creer deux triggers et une table temporaire, le premier trigger est before UPDATE :
    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 tr_update_temp_feature_title BEFORE UPDATE OF DESCRIPTION ON La_table
    FOR EACH ROW WHEN (NEW.request_type_id ='30240')
    DECLARE
     
    cursor c_reqId is 
    	SELECT distinct to_number(kr.parameter1) as reqId
    	FROM table2 kr
    	WHERE kr.ref_relationship_id='15'
    	AND kr.source_id= :NEW.REQUEST_ID ;
     
    BEGIN
     
    FOR tyty in c_reqId LOOP
    	insert into Table_temporaire values (tyty.reqId,:NEW.DESCRIPTION);
    END LOOP;
     
    END;

    et un after update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create or replace
    TRIGGER tr_update_feature_title AFTER UPDATE OF DESCRIPTION ON La_table
     
    BEGIN
     
    update La_table kr set description = (select distinct description from Table_temp pf where kr.request_id = pf.request_id)
    where kr.request_id in (select request_id from Table_temp);
     
    delete from PMP_temp_feature;
    END;
    Le premier trigger marche sans problemes, mais le second genere une erreur:

    ORA-00036 maximum number of recursive SQL levels (50) exceeded .

    Sachant qu'il y a aussi d'autres triggers qui sont definis sur le meme champ de la meme table.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 60
    Par défaut
    Erreur bete, le trigger ne fait que se rapeller lui meme avec le update ...

  6. #6
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Si c'est , n'oublie pas le tag.

Discussions similaires

  1. Syntaxe Trigger before update
    Par dcabe dans le forum PL/SQL
    Réponses: 8
    Dernier message: 21/07/2008, 09h53
  2. Syntaxe Trigger Mysql / Transact SQL de SQL Server
    Par Flashball dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 13/03/2008, 15h23
  3. Problème de syntaxe trigger
    Par Nimothenicefish dans le forum PL/SQL
    Réponses: 14
    Dernier message: 24/01/2008, 11h13
  4. syntaxe trigger : unknow token
    Par nozostan dans le forum SQL
    Réponses: 5
    Dernier message: 05/12/2007, 00h53
  5. Pb de syntaxe trigger/begin.. end ?
    Par leup dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 19/01/2007, 14h04

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