Ci sei quasi; hai bisogno di un blocco DECLARE in un trigger se vuoi dichiarare qualcosa; questo significa che la tua clausola WHEN è nel posto sbagliato.
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 Violino
Alcuni punti:
- Mai cattura un'eccezione e quindi chiama DBMS_OUTPUT.PUT_LINE; è inutile. Qualcuno deve essere presente per visualizzare il risultato di ogni singolo record. Se non vuoi che accada qualcosa, solleva l'eccezione e poi catturala. Ho aggiunto un codice di errore alla tua eccezione in modo che tu possa intercettarlo al di fuori del trigger e gestirlo come desideri (non stampare nulla su stdout).
- È un punto minore ma ho aggiunto un piccolo spazio bianco; non tanto. Inizialmente non riuscivo a vedere dove fosse il problema con il tuo codice perché non ne avevi.
- Ti mancavano i punti e virgola dopo la dichiarazione di eccezione e RAISE.
Maggiori informazioni sulle eccezioni definite internamente nella documentazione