Jesteś prawie na miejscu; potrzebujesz bloku DECLARE w wyzwalaczu, jeśli chcesz coś zadeklarować; oznacza to, że twoja klauzula WHEN znajduje się w niewłaściwym miejscu.
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;
Skrzypce SQL
Kilka punktów:
- Nigdy złapać wyjątek, a następnie wywołać DBMS_OUTPUT.PUT_LINE; To bezcelowe. Ktoś musi tam być, aby zobaczyć wynik każdego rekordu. Jeśli nie chcesz, aby coś się wydarzyło, zgłoś wyjątek i złap go. Dodałem kod błędu do twojego wyjątku, dzięki czemu możesz przechwycić to poza wyzwalaczem i obsłużyć go tak, jak chcesz (nie drukuj niczego na standardowe wyjście).
- To drobna kwestia, ale dodałem trochę spacji; niewiele. Początkowo nie mogłem zobaczyć, gdzie był problem z twoim kodem, ponieważ go nie miałeś.
- Brakowało średników po deklaracji wyjątku i RAISE.
Przeczytaj więcej o wyjątkach zdefiniowanych wewnętrznie w dokumentacji