Je bent er bijna; je hebt een DECLARE-blok in een trigger nodig als je iets wilt declareren; dit betekent dat uw WHEN-clausule op de verkeerde plaats staat.
create or replace trigger trig1
before update
of sal
on emp
for each row
when (new.sal < old.sal)
declare
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
begin
raise user_xcep;
end;
SQL Fiddle
Een paar punten:
- Nooit een uitzondering opvangen en vervolgens DBMS_OUTPUT.PUT_LINE aanroepen; het is zinloos. Per record moet er iemand aanwezig zijn om het resultaat te bekijken. Als je niet wilt dat er iets gebeurt, roep dan de uitzondering op en vang hem dan. Ik heb een foutcode aan uw uitzondering toegevoegd, zodat u deze buiten de trigger kunt opvangen en deze kunt afhandelen zoals u wilt (druk niets af naar stdout).
- Het is een klein puntje, maar ik heb wat witruimte toegevoegd; niet veel. Ik kon aanvankelijk niet zien waar het probleem zat met je code, omdat je er geen had.
- Je miste puntkomma's na de uitzonderingsverklaring en RAISE.
Lees meer over intern gedefinieerde uitzonderingen in de documentatie