Message de raise_application_error dans les triggers

LAFONT Messages postés 4 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 7 juillet 2009 - 7 juil. 2009 à 10:49
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 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;
/

Merci

F Lafont

3 réponses

nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
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
0
LAFONT Messages postés 4 Date d'inscription mardi 30 juin 2009 Statut Membre Derniè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.

Merci
F lafont
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
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.
0
Rejoignez-nous