Abrindo uma nova sessão para execução do PL/SQL
[ad#texto]
O Oracle implementa um controle de sessões durante a execução de qualquer código PL/SQL (procedure, trigger, etc), assim um ROLLBACK ou um COMMIT é propagada por toda a sessão, esta forma de execução geralmente auxilia o trabalho do desenvolvedor, pois o mesmo relega ao Oracle o controle sobre sua submissão PL/SQL, porém pode ocorrer casos onde precisamos que um trecho específico de PL/SQL seja executado e tenha um COMMIT ou ROLLBACK a parte do restante do código PL/SQL.
Um problema complexo que é bem fácil de ser resolvido através do comando PRAGMA AUTONOMOUS_TRANSACTION.
O comando PRAGMA AUTONOMOUS_TRANSACTION do PL/SQL tem a capacidade de iniciar uma nova sessão para o trecho de código PL/SQL indicado, assim qualquer execução de um ROLLBACK ou COMMIT será executado somente dentro da nova sessão, não refletindo na sessão original.
Este recurso é muito utilizado no caso de LOG´s, onde ao levantar uma exceção a sessão original irá efetuar ROLLBACK, porém faz uma chamada a um PROCEDURE que irá inserir dados em uma tabela de LOG´s, sem o PRAGMA AUTONOMOUS_TRANSACTION o ROLLBACK da sessão original iria apagar os dados gravados no LOG durante aquela sessão ou o COMMIT do processo de LOG irá gravar dados do momento da exceção, resultado em dados gravados em tabela durante um processo errôneo.
Abaixo segue dois exemplos diferentes do uso de PRAGMA AUTONOMOUS_TRANSACTION.
Neste exemplo toda a função da PACKAGE especificada terá a capacidade de ser autônoma, tudo o que for realizado de COMMIT ou ROLLBACK irá refletir somente em seu escopo, sem afetar os outros elementos da PACKAGE.
CREATE PACKAGE banking AS
...
FUNCTION balance (acct_id INTEGER) RETURN REAL;
END banking;
CREATE PACKAGE BODY banking AS
...
FUNCTION balance (acct_id INTEGER) RETURN REAL IS
PRAGMA AUTONOMOUS_TRANSACTION;
my_bal REAL;
BEGIN
...
END;
END banking;
Neste outro exemplo de PRAGMA AUTONOMOUS_TRANSACTION, vamos ter que toda a TRIGGER será autônoma e ao contrário das TRIGGER´s regulares uma TRIGGER autônoma tem a capacidade de conter declarações controle de transação.
CREATE TRIGGER parts_trigger
BEFORE INSERT ON parts FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO parts_log VALUES(:new.pnum, :new.pname);
COMMIT; -- allowed only in autonomous triggers
END;