Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como gerar uma exceção dentro de um gatilho? Existe uma maneira de fazer isso?


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:
  1. 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).
  2. É 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.
  3. 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