Você está quase lá; você precisa de um bloco DECLARE em um gatilho se quiser declarar alguma coisa; isso significa que sua cláusula WHEN está no lugar errado.
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
Alguns pontos:
- Nunca capture uma exceção e chame DBMS_OUTPUT.PUT_LINE; é inútil. Alguém tem que estar lá para ver o resultado de cada registro. Se você não quer que algo aconteça, levante a exceção e então capture-a. Eu adicionei um código de erro à sua exceção para que você possa pegar isso fora do gatilho e tratá-lo como quiser (não imprima nada no stdout).
- É um ponto menor, mas adicionei um pequeno espaço em branco; não muito. Inicialmente, não consegui ver onde estava o problema com seu código porque você não tinha nenhum.
- Está faltando ponto e vírgula após a declaração de exceção e RAISE.
Leia mais sobre exceções definidas internamente na documentação