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 10/03/2006, 17h54   #1
Invité de passage
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : 0
Points : 0
Par défaut Erreur ORA-21000 en PL/SQL pour un trigger

Citation:
ORA-21000: l'argument numéro d'erreur utilisé pour raise_application_error de 1 est hors limites
ORA-06512: à "LD5V.ANNULE_RESERVATION", ligne 20
ORA-04088: erreur lors d'exécution du déclencheur 'LD5V.ANNULE_RESERVATION'
Voici donc l'erreur que j'ai lorsque je veux updater ma table reservation, j'ai essayé plein de chiffres différents pour le raise application erreur, mais rien n'y fait...
Voici le code de mon trigger :
Code :
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 annule_reservation
BEFORE UPDATE
ON reservation
FOR EACH ROW
 
DECLARE
	jourDepart		DATE ;
	erreurDate 		EXCEPTION ;	
 
BEGIN	
 
	SELECT jour_depart INTO jourDepart		
	FROM vol 
	WHERE n_vol = :new.num_Vol_res ;
 
 
	IF (( SYSDATE > jourDepart -2 ) AND ((:old.est_Confirme = 0) AND (:new.est_Confirme = 1)) )  	THEN		
 
		raise erreurDate ;
 
	END IF;	
 
EXCEPTION	
	WHEN erreurDate THEN
		raise_application_error(-10000,'Il fallait confirme au moins 2 jours avant le depart.');		
END;
/


Bon sinon, j'ai un autre problème lié à celui ci finalement. Lorsque mon trigger se déclenche, c'est bien il affiche un message d'erreur, mais ma table est qd même modifié. Comment dire au trigger qu'il ne faut pas qu'afficher mais carrément empêcher de continuer à la requête... Peut être avec raise application error, mais comme vous pouvez le constater, ça veut pas...

Merci infiniment pour votre aide...
keuhlu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2006, 19h02   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Le premier message d'erreur est assez explicite: le premier argument de raise_application _error est incorrect. Il doit être entre -20000 et -20999:

Citation:
To call RAISE_APPLICATION_ERROR, use the syntax

raise_application_error(
error_number, message[, {TRUE | FALSE}]);

where error_number is a negative integer in the range -20000 .. -20999
Si l'UPDATE est quand même exécuté, c'est qu'ensuite un COMMIT est exécuté au lieu d'un ROLLBACK.
Pour récupérer votre exception, le code appelant doit exécuter:

Code :
1
2
3
4
5
6
7
 
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = <raise application error code>
THEN
  ROLLBACK;
END IF;
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2006, 22h46   #3
Invité de passage
 
Inscription : mars 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 6
Points : 0
Points : 0
Par défaut OK !

Merci beaucoup, je vais tester ça.
Sinon est-il possible dans un trigger de faire un DELETE sur la ligne que l'on a en ligne de mire puisqu'elle a déclenché le trigger. Il me semble que j'ai eu une erreur de mutation je.sais.pu.quoi lorsque j'avais essayé ça.

dans mon trigger juste après mon IF, j'avais essayé : voire premier msg
DELETE FROM reservation r
WHERE r.id_res= :old.id_res;

et ça ne marchait pas !

Donc savez vous comment supprimer la ligne qui nous embête ds un trigger ?
Merci !
keuhlu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2006, 08h47   #4
Membre habitué
 
Avatar de Process Linux
 
Inscription : septembre 2003
Messages : 136
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 136
Points : 118
Points : 118
Envoyer un message via ICQ à Process Linux Envoyer un message via MSN à Process Linux Envoyer un message via Yahoo à Process Linux
Si tu veux supprimer une ligne de la table concernée par le déclencheur tu vas tomber dans le problème de la table mutante.

Donc Oracle refuse cette suppression. Tu peux essayer une solution paliative :

Il faut créer une table temporaire X , la structure de cette table contient juste les champs qui font l'identifiant de ta table "Reservation" par exemple .

dans le déclancheur de la table reservation tu vas inserer la ligne que tu veux effacer dans la table temporaire X .
Dans la table X , tu vas mettre un déclancheur sur l'évenement after insert, dans le traitement tu vas mettre un delete sur la table reservation avec une condition sur la clé que tu as stocké dans la table X.

voilà , c'est une solution barbar , mais c'est ce qu'il faut faire pour eviter le problème de table mutante.
Process Linux 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 11h27.


 
 
 
 
Partenaires

Hébergement Web