Ya casi estás ahí; necesita un bloque DECLARE en un activador si desea declarar algo; esto significa que su cláusula WHEN está en el lugar equivocado.
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;
Violín SQL
Algunos puntos:
- Nunca captura una excepción y luego llama a DBMS_OUTPUT.PUT_LINE; Carece de sentido. Alguien tiene que estar allí para ver el resultado de todos y cada uno de los registros. Si no desea que suceda algo, genere la excepción y luego agárrela. Agregué un código de error a su excepción para que pueda capturar esto fuera del disparador y manejarlo como desee (no imprima nada en la salida estándar).
- Es un punto menor, pero agregué un pequeño espacio en blanco; no mucho. Inicialmente no pude ver dónde estaba el problema con tu código porque no tenías ninguno.
- Le faltaban puntos y comas después de la declaración de excepción y RAISE.
Obtenga más información sobre las excepciones definidas internamente en la documentación