Du är nästan där; du behöver ett DECLARE-block i en trigger om du vill deklarera något; detta betyder att din WHEN-sats är på fel plats.
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
Några punkter:
- Aldrig fånga ett undantag och anropa DBMS_OUTPUT.PUT_LINE; det är meningslöst. Någon måste vara där för att se resultatet för varje skiva. Om du inte vill att något ska hända, höj undantaget och fånga det sedan. Jag har lagt till en felkod till ditt undantag så att du kan fånga detta utanför triggern och hantera det som du vill (skriv inte ut något till stdout).
- Det är en liten punkt men jag har lagt till ett litet blanksteg; inte mycket. Jag kunde först inte se var problemet var med din kod eftersom du inte hade någon.
- Du saknade semikolon efter undantagsdeklarationen och RAISE.
Läs mer om internt definierade undantag i dokumentationen