quarta-feira, 15 de dezembro de 2010

Trigger – Execute Immediate (IN/OUT)

Por definição as Triggers não podem conter os comandos Commit ou Roolback, no exemplo abaixo, o comando Execute Immediate, chama uma procedure que, em seu código, possui os comandos Commit e Roolback, isso causa erro durante a execução da Trigger, para evitar esse problema usa-se a diretiva PRAGMA AUTONOMOUS_TRANSACTION, veja neste blog uma definição para esta diretiva.

CREATE OR REPLACE TRIGGER AO_367_TGR_AIU

       AFTER INSERT OR UPDATE ON AO_367_TGR

       FOR EACH ROW

DECLARE

       PRAGMA AUTONOMOUS_TRANSACTION; --Força que a trigger aceite commit / Existe commit dentro da procedure

       V_RES CHAR(1);

BEGIN

       IF :NEW.STATUS = 'L' THEN

          DBMS_OUTPUT.PUT_LINE (:NEW.SAP_ID || ' - NEW: ' || :NEW.STATUS || ' - OLD: '|| :OLD.STATUS);

          EXECUTE IMMEDIATE 'BEGIN AO_COMP_SAP_X_GIS (:SAP_ID, :V_RES); END;' USING 120, OUT V_RES;

          DBMS_OUTPUT.PUT_LINE (V_RES);

       END IF;

END;

OBS.: Não existe a necessidade de utilziar o comando Execute Immediate no script acima, isso foi utilizado apenas para exemplo de uma chamada de procedure com parâmetros IN e OUT.

Nenhum comentário :

Postar um comentário

Related Posts Plugin for WordPress, Blogger...