Už jste skoro tam; pokud chcete něco deklarovat, potřebujete blok DECLARE ve spouštěči; to znamená, že vaše klauzule WHEN je na nesprávném místě.
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
Několik bodů:
- Nikdy zachytit výjimku a poté zavolat DBMS_OUTPUT.PUT_LINE; je to zbytečné. Někdo tam musí být, aby viděl výsledek každého záznamu. Pokud nechcete, aby se něco stalo, aktivujte výjimku a pak ji chyťte. Do vaší výjimky jsem přidal kód chyby, abyste to mohli zachytit mimo spouštěč a zpracovat to, jak chcete (netisknout nic do stdout).
- Je to menší bod, ale přidal jsem trochu mezer; nic moc. Původně jsem nemohl zjistit, kde je problém s vaším kódem, protože jste žádný neměli.
- Po deklaraci výjimky a RAISE vám chyběly středníky.
Přečtěte si více o interně definovaných výjimkách v dokumentaci