Message de raise_application_error dans les triggers
LAFONT
Messages postés4Date d'inscriptionmardi 30 juin 2009StatutMembreDernière intervention 7 juillet 2009
-
7 juil. 2009 à 10:49
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 2010
-
7 juil. 2009 à 12:29
Bonjour
J'ai un trigger très simple : je veux interdite l'insertion dans certains cas .
Comme le ROLLBACK, COMMIT est interdit dans le trigger, j'utilise raise_application_error. Mias je ne veux voir que mon message et non les autres
exemple de sortie : je veux seulement ORA-20100 et pas les autres
ERREUR à la ligne 1 :
ORA-20100: Insertion ou mise à jour interdite
ORA-06512: à "SYS.FGIT1", ligne 17
ORA-04088: erreur lors d'exécution du déclencheur 'SYS.FGIT1'
Comment ne pas afficher ORA-06512 et ORA-04088 (qui donne le nom du trigger, ce que je veux pas) ?
CREATE OR REPLACE TRIGGER fgit1
AFTER INSERT ON ulis.fgi FOR EACH ROW
declare
retour NUMBER;
INTERDIT EXCEPTION;
AUTORISE EXCEPTION;
BEGIN
dbms_output.put_line('code= '|| :new.code);
dbms_output.put_line('libelle= '|| :new.libelle);
IF INSERTING THEN
dbms_output.put_line('INSERTION');
IF (:new.code = :new.libelle) THEN
dbms_output.put_line('***********************INSERTION INTERDITE');
raise_application_error (-20100,'Insertion ou mise à jour interdite',FALSE);
ELSE
dbms_output.put_line('\n******************* AUTORISE *********************');
END IF;
END IF;
END;
/
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 7 juil. 2009 à 11:19
De but en blanc comme ca je dirais qu'une erreure de ce type n'est déjà pas sensée etre vue de l'utilisateur, c'est a l'application de reccuperer les erreurs, de les interpreter et de remonter une information fonctionnelle a l'utilisateur.
Tu dois etre la sous toad ou SqlPlus qui sont des outils de devellopement/administration et qui donc remontent toutes les erreurs de maniere brute (pour aider au debug) c'est aussi pour ca que tu n'a aucun probleme avec tes dbms_output (dans un trigger on frôle l'hérésie)
Un trigger communique avec l'appliaction applante, pas avec l'utilisateur, ce devrait etre un principe de developpement.
Imagine dans ton cas une proc stock avec un bloc
Begin
insert into ulis.fgi (code, libelle) values (:v_code, :v_libelle);
exception
When -20100 then
dbms_output.put_line('***********************INSERTION INTERDITE');
When Other
dbms_output.put_line('erreur :' || to_char(SQLERR) || ' : ' || SQLERRM);
End
a ce moment la l'utilisateur ne vois aucun message d'erreur mais juste ton dbms_output
LAFONT
Messages postés4Date d'inscriptionmardi 30 juin 2009StatutMembreDernière intervention 7 juillet 2009 7 juil. 2009 à 11:29
Bonjour,
Mon problème est sous sqlplus ou toad en fait.
Je veux interdire les insertions autres que celles faites par l'application. Donc pas d'insert possible par sqlplus. (Mon trigger avec dbms_output est en exemple simple pour tester). Je peux aussi ne rien afficher. Ce que je veux surtout,c'est qu'on ne voit pas le nom du trigger (ou de la fonction) qui appelle le raise_application_error.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 7 juil. 2009 à 12:29
J'avous que je seche, comme je te l'ai dis, SqlPlus et Toad sont des applications particulieres et leur comportement normal est d'afficher toute la stack d'erreur. Je doute que ton probleme soit solvable.