Почти сте там; имате нужда от блок DECLARE в тригер, ако искате да декларирате нещо; това означава, че вашата клауза WHEN е на грешното място.
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
Няколко точки:
- Никога хванете изключение и след това извикайте DBMS_OUTPUT.PUT_LINE; безсмислено е. Някой трябва да бъде там, за да види резултата за всеки запис. Ако не искате нещо да се случи, повдигнете изключението и след това го хванете. Добавих код за грешка към вашето изключение, за да можете да хванете това извън тригера и да го обработвате както желаете (не отпечатвайте нищо в стандартен извеждащ текст).
- Това е незначителен момент, но добавих малко празно пространство; не много. Първоначално не можах да видя къде е проблемът с кода ви, защото нямате такъв.
- Липсваха ви точка и запетая след декларацията на изключението и РАЙС.
Прочетете повече за вътрешно дефинираните изключения в документацията