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] - PLS-00103


Sujet :

Oracle

  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] - PLS-00103
    Bonjour !!

    j'ai un probleme avec ce trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE TRIGGER TRIG_B_AFTUPD
    AFTER UPDATE ON TABLE1
    FOR EACH ROW
    	BEGIN
    		-- Suppr des anciennes occurences --
    		DELETE FROM TABLE1 WHERE NO=:NEW.no ;
    		-- Insertion des nouvelles lignes
    		INSERT INTO LOGUPD_T1 ( CH1, CH2, CH3) VALUES ( SELECT CH1,CH2,CH3 FROM TABLE1 WHERE NO=:NEW.NO ) ;
    	END;
    /
    SHOW ERRORS;
    qu'ya t il de faux ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ERROR : 
    PLS-00103: Encountered the symbol "SELECT" when expecting one of
             the following:
             ( - + mod not null others <an identifier>
             <a double-quoted delimited-identifier> <a bind variable> avg
             count current exists max min prior sql stddev sum variance
             execute forall time timestamp interval date
             <a string literal with character set specification>
             <a number> <a single-quoted SQL string>

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    L'erreur est pourtant claire... Tu as un select à un endroit où il ne devrait pas y en avoir :
    - soit tu fais insert into ... values (...);
    - soit tu fais insert into ... select .... ;

  3. #3
    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
    le problème je l'avais compris....

    mais la solution au problème... je l'ai pas trouvé...

    j'ai juste trouver une solution sur le métalink mais fonctionne à partir de la 9i.

    INFO : Ca doit être compatible avec une 8.1.7.4

    --

    c'est vrai que le trigger ce compile si j'enlève VALUES mais lors de l'exec du trigger j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ERROR at line 1:
    ORA-04091: table OPS$T.T1 is mutating, trigger/function may not see it
    ORA-06512: at "OPS$T.TRIG_T1_AFTUPD", line 5
    ORA-04088: error during execution of trigger 'OPS$T.TRIG_T1_AFTUPD'

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    http://sgbd.developpez.com/oracle/ora-04091/

    [EDIT] Si tu fais ton delete avant de faire ton insert, tu ne vas pas insérer garnd chose [/EDIT]

  5. #5
    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
    merci pour la doc

    cepandant etant sur une 8.1.7 ... je souhaitai pouvoir faire un REPLACE mais comme la fonction n'existe pas je suis obligé de suppr. les anciennes lignes puis en inserer de nouvelle...

    bon vé lire la doc pour voir si ca résoud mon pb.

  6. #6
    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'ai bien lu la doc mais a un truc pas clair ???
    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
     
    CREATE OR REPLACE TRIGGER TRIG_BRANCARD_AFTUPD
    AFTER UPDATE ON BRANCARD
    FOR EACH ROW
    	BEGIN
    		-- Suppr des anciennes occurences --
    		DELETE FROM LOGUPD_BRANCARD WHERE NO_BRANC=:NEW.no_branc ;
    		-- Insertion des nouvelles lignes
    		INSERT INTO LOGUPD_BRANCARD 
    			(
    				NO_HOP,NO_BRANC,TY_BRANC,DT_SAISI,dt_print,dt_trans,id_patient,id_codlit,
    				sl_demande,md_trans,ur_trans,de_plttech,de_passint,de_exradio,de_amphite,
    				tr_agent1,tr_agent2,tr_sagent,rm_branc,dl_branc
    			) (
    				SELECT 
    					NO_HOP,NO_BRANC,TY_BRANC,DT_SAISI,dt_print,dt_trans,id_patient,id_codlit,
    					sl_demande,md_trans,ur_trans,de_plttech,de_passint,de_exradio,de_amphite,
    					tr_agent1,tr_agent2,tr_sagent,rm_branc,dl_branc
    				FROM 
    					brancard 
    				WHERE 
    					NO_BRANC=:NEW.NO_BRANC
    			) ;
    	END;
    /
    SHOW ERRORS;
    voila le code du trigger

    Normalement qd on utilise After update ; cela ce passe après commande update.. donc un commit implicite a eu lieu .. en quoi la suppression dans la table LOGUPD_BRANCARD -- qui est une copie de BRANCARD sans aucune contrainte -- suivi d'un insertion dans cette même table rendre la table brancard mutante (sachant qu'un select ne pose pas de verrou) ??

    pas tout compris ??

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    C'est ton select sur la table brancard qui cause cette erreur. Dans ton trigger after update le processus de mise à jour de la base n'est pas achevé. Et le commit n'est pas fait, il peut être fait bien plus tard ou pas du tout en cas de rollback.

  8. #8
    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
    comment forcer le commit ?
    parce que je crois que l'on ne peut pas mettre un commit dans un trigger ?!?

    en passant par un job ??

  9. #9
    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
    j'ai la même erreur en passant pas en curseur ??
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    CREATE OR REPLACE TRIGGER TRIG_BRANCARD_AFTUPD
    AFTER UPDATE ON BRANCARD
    FOR EACH ROW
    	DECLARE
    		CURSOR C1 IS SELECT NO_HOP,NO_BRANC,TY_BRANC,DT_SAISI,dt_print,dt_trans,id_patient,id_codlit,sl_demande,md_trans,ur_trans,de_plttech,de_passint,de_exradio,de_amphite,tr_agent1,tr_agent2,tr_sagent,rm_branc,dl_branc FROM brancard WHERE NO_BRANC=:NEW.NO_BRANC ;		
    		NO_HOP		brancard.NO_HOP%TYPE;
    		NO_BRANC	brancard.NO_BRANC%TYPE;
    		TY_BRANC	brancard.TY_BRANC%TYPE;
    		DT_SAISI	brancard.DT_SAISI%TYPE;
    		dt_print	brancard.dt_print%TYPE;
    		dt_trans	brancard.dt_trans%TYPE;
    		id_patient	brancard.id_patient%TYPE;
    		id_codlit	brancard.id_codlit%TYPE;
    		sl_demande	brancard.sl_demande%TYPE;
    		md_trans	brancard.md_trans%TYPE;
    		ur_trans	brancard.ur_trans%TYPE;
    		de_plttech	brancard.de_plttech%TYPE;
    		de_passint	brancard.de_passint%TYPE;
    		de_exradio	brancard.de_exradio%TYPE;
    		de_amphite	brancard.de_amphite%TYPE;
    		tr_agent1	brancard.tr_agent1%TYPE;
    		tr_agent2	brancard.tr_agent2%TYPE;
    		tr_sagent	brancard.tr_sagent%TYPE;
    		rm_branc	brancard.rm_branc%TYPE;
    		dl_branc	brancard.dl_branc%TYPE;
    	BEGIN
    		-- Suppr des anciennes occurence --
    		DELETE FROM LOGUPD_BRANCARD WHERE NO_BRANC=:NEW.no_branc ;	
    		open c1 ;
    		LOOP
    			FETCH c1 INTO NO_HOP,NO_BRANC,TY_BRANC,DT_SAISI,dt_print,dt_trans,id_patient,id_codlit,
    				sl_demande,md_trans,ur_trans,de_plttech,de_passint,de_exradio,de_amphite,
    				tr_agent1,tr_agent2,tr_sagent,rm_branc,dl_branc ;
    			EXIT WHEN c1%NOTFOUND;
    			-- Insertion des nouvelles lignes
    			INSERT INTO LOGUPD_BRANCARD 
    			(
    				NO_HOP,NO_BRANC,TY_BRANC,DT_SAISI,dt_print,dt_trans,id_patient,id_codlit,
    				sl_demande,md_trans,ur_trans,de_plttech,de_passint,de_exradio,de_amphite,
    				tr_agent1,tr_agent2,tr_sagent,rm_branc,dl_branc
    			) VALUES (
    				NO_HOP,NO_BRANC,TY_BRANC,DT_SAISI,dt_print,dt_trans,id_patient,id_codlit,
    				sl_demande,md_trans,ur_trans,de_plttech,de_passint,de_exradio,de_amphite,
    				tr_agent1,tr_agent2,tr_sagent,rm_branc,dl_branc
    			) ;
    		END LOOP;
    		close c1 ;		
    	END ;
    /
    SHOW ERRORS;
    ----------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ERROR at line 1:
    ORA-04091: table OPS$BRANCARD.BRANCARD is mutating, trigger/function may not see it
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD_AFTUPD", line 2
    ORA-06512: at "OPS$BRANCARD.TRIG_BRANCARD_AFTUPD", line 26
    ORA-04088: error during execution of trigger 'OPS$BRANCARD.TRIG_BRANCARD_AFTUPD'

  10. #10
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Oui, c'est logique : tu ne peux pas faire d'update ou d'insert sur la table à laquelle est rattachée ton trigger. Les seules solutions sont celles indiquées dans la doc que je t'ai indiquée.

    A mon avis tu as un problème conceptuel. Que veux-tu faire précisément et clairement (pour que je comprenne ) ?

Discussions similaires

  1. [PL/SQL] Erreur PLS-00103 dans un trigger
    Par sami.g dans le forum Oracle
    Réponses: 1
    Dernier message: 18/12/2006, 17h57
  2. Réponses: 4
    Dernier message: 23/05/2006, 17h04
  3. [Pl/Sql] PLS-00103 triggers
    Par madimane dans le forum Oracle
    Réponses: 2
    Dernier message: 14/03/2006, 07h11
  4. Erreur PLS 00103
    Par claralavraie dans le forum Oracle
    Réponses: 4
    Dernier message: 05/01/2006, 17h44
  5. fonction LAG et erreur PLS-00103. Oracle 8i
    Par henrirobert dans le forum Oracle
    Réponses: 7
    Dernier message: 26/05/2005, 16h03

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