Du er der næsten; du skal bruge en DECLARE-blok i en trigger, hvis du vil erklære noget; det betyder, at din WHEN-sætning er det forkerte sted.
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
Et par punkter:
- Aldrig fange en undtagelse og kald derefter DBMS_OUTPUT.PUT_LINE; det er meningsløst. Nogen skal være der for at se resultatet for hver eneste post. Hvis du ikke ønsker, at der skal ske noget, rejs undtagelsen og fang den. Jeg har tilføjet en fejlkode til din undtagelse, så du kan fange denne uden for triggeren og håndtere den, som du vil (udskriv ikke noget til stdout).
- Det er et mindre punkt, men jeg har tilføjet et lille mellemrum; ikke meget. Jeg kunne i første omgang ikke se, hvor problemet var med din kode, fordi du ikke havde nogen.
- Du manglede semikolon efter undtagelseserklæringen og RAISE.
Læs mere om internt definerede undtagelser i dokumentationen