Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2007, 17h17   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 1
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 1
Points : 0
Points : 0
Par défaut Syntaxe Trigger before update

Bonjour,
Je souhaite crée dans base Oracle le trigger suivant:
(équivalent à un update en cascade en fait...)

create or replace trigger UPD_GLOSS_PAYS
before update of GLOSS_NO on GLOSSARY
referencing
OLD as ligneAvant
NEW as ligneAprès
for each row
when (GLOSSARY.TYPE_NO = 'CP')
begin
update CONTRAT_TX
set PAYS = :ligneAvant.GLOSS_NO
where PAYS = :ligneAprès.GLOSS_NO ;
end;

j'obtiens le message erreur suivant:
ORA-04076: spécification NEW ou OLD erronée

Quelqu'un pourrait m'aider ???
Merci par avance
dcabe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 09h43   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209


Pourquoi s'embetter à renommer old et new ?

Code :
1
2
3
4
5
6
7
8
9
CREATE OR REPLACE TRIGGER UPD_GLOSS_PAYS
before UPDATE of GLOSS_NO ON GLOSSARY 
FOR each row
when (GLOSSARY.TYPE_NO = 'CP') 
begin
UPDATE CONTRAT_TX 
SET PAYS = :old.GLOSS_NO
WHERE PAYS = :new.GLOSS_NO ;
end;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2007, 09h56   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Bon, j'ai lutté pour trouver pourquoi l'erreur apparait : Vive mes cours !
Citation:
Attention : La condition de la clause WHEN peut contenir les colonnes préfixées par old et new
J'ai fait un test, ça plante en fait à cause de la clause WHEN

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE TRIGGER UPD_GLOSS_PAYS
before UPDATE of GLOSS_NO ON GLOSSARY 
referencing 
OLD AS ligneAvant
NEW AS ligneAprès
FOR each row
when (ligneAvant.TYPE_NO = 'CP') 
begin
UPDATE CONTRAT_TX 
SET PAYS = :ligneAvant.GLOSS_NO
WHERE PAYS = :ligneAprès.GLOSS_NO ;
end;
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 14h21   #4
Membre Expert
 
Inscription : mars 2002
Messages : 954
Détails du profil
Informations personnelles :
Âge : 40

Informations forums :
Inscription : mars 2002
Messages : 954
Points : 1 086
Points : 1 086
Citation:
Envoyé par McM Voir le message
Bon, j'ai lutté pour trouver pourquoi l'erreur apparait : Vive mes cours !

J'ai fait un test, ça plante en fait à cause de la clause WHEN

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE TRIGGER UPD_GLOSS_PAYS
before UPDATE of GLOSS_NO ON GLOSSARY 
referencing 
OLD AS ligneAvant
NEW AS ligneAprès
FOR each row
when (ligneAvant.TYPE_NO = 'CP') 
begin
UPDATE CONTRAT_TX 
SET PAYS = :ligneAvant.GLOSS_NO
WHERE PAYS = :ligneAprès.GLOSS_NO ;
end;
doit manquer un ":" devant ligneavant
devyan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 14h41   #5
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Citation:
Envoyé par devyan Voir le message
doit manquer un ":" devant ligneavant
Pas si sûr
Citation:
WHEN Clause
Specify the trigger restriction, which is a SQL condition that must be satisfied for Oracle to fire the trigger. See the syntax description of condition in Chapter 5, "Conditions". This condition must contain correlation names and cannot contain a query.

The NEW and OLD keywords, when specified in the WHEN clause, are not considered bind variables, so are not preceded by a colon . However, you must precede NEW and OLD with a colon in all references other than the WHEN clause.

mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 16h41   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
C'est même certain que NON.
pas de :new.colonne, mais new.colonne dans la clause WHEN.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2008, 16h58   #7
Membre Expert
 
Inscription : mars 2002
Messages : 954
Détails du profil
Informations personnelles :
Âge : 40

Informations forums :
Inscription : mars 2002
Messages : 954
Points : 1 086
Points : 1 086
Alors peut être que le pb provient de l'accent dans l'alias ligneAprès
devyan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2008, 01h05   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Tu sais, tu as repris un post d'octobre 2007....
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2008, 09h53   #9
Membre Expert
 
Inscription : mars 2002
Messages : 954
Détails du profil
Informations personnelles :
Âge : 40

Informations forums :
Inscription : mars 2002
Messages : 954
Points : 1 086
Points : 1 086
Non, je n'avais pas vu...

Simplement vu qu'il n'était pas clos (résolu)
devyan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h14.


 
 
 
 
Partenaires

Hébergement Web