Autonomous Transaction Context

Threads em PL/SQL ?

Boa Noite minha gente !

Ainda estou me acostumando com isso aqui, pegando no tranco… hehe

Hoje vou postar um pouco sobre Oracle PL/SQL (e com o tempo vocês vão perceber que eu gosto da coisa… rs)

A dica que vou dar é muito simples mas funcional. Vamos supor que temos um processo que demora muito tempo para ser executado, e não sabemos o porque. O primeiro passo, é claro, seria debugar o seu código. Um método convencional para tal ação seria inserir aluns “dbms_output.put_line” no código. Mas e se você quisesse gravar o resultado desse debug? Você poderia apenas inserir uma linha em alguma tabela temporária. Problema resolvido, certo??? ERRADO !

Para que o insert funcione, é necessário que exista um commit no código, o que pode não ser permitido dependendo do processamento que está sendo feito. Nesse caso, nosso processo iria inserir as linhas mas não conseguiríamos ver (caso o processo nao chegasse ao final) o que não é interessante. Para resolver tal questão, decidi criar uma procedure PRC_LOG que ao ser chamada insere um registro numa tabela de log e commita. Para que esse commit não interfira no “processo pai” que está sendo executado, é necessário que a procedure esteja com o pragma autonomous_transaction. Um pragma define o estado do código, é como se estivéssemos mandando uma mensagem para o compilador do oracle. Existem diversos tipos de pragma, e o que utilizamos (autonomous_transaction) serve para executar o processo em modo “autônomo”, ou seja de modo independente ao processamento atual (em outro contexto). Em programação, esse conceito é conhecido como Thread (ou processamento paralelo) e pode ser aplicado para qualquer coisa além do descrito acima, basta usar a criatividade! =]

Segue então, o código do exemplo acima:

-- create table log (a varchar2(4000));

create or replace procedure PRC_LOG (PARAM in varchar2) as
  pragma autonomous_transaction;
begin
  insert into LOG values ( PARAM );
  commit;
end PRC_LOG;
/

É isso ai! Simples mas funcional.

Espero que tenham gostado!

Até a próxima =]

Se você enxergar o que está por trás de todas as coisas sem exceção, então tudo se tornará transparente para você. Mas um mundo completamente transparente é um mundo invisível.
– C.S. Lewis 

7 opiniões sobre “Threads em PL/SQL ?”

  1. Aíí sim heein!

    Eu cheguei a “começar a ler” sobre isso em foruns mas os cara dava mta volta e não saia do lugar…. ficou como você falou, “por cima” mas foi objetivo, entendi melhor doque os “prózão” falando kkkk

    Abraço <3

  2. PARABÉNS! Muito bom, falou bonito, foi claro e objetivo, para um próximo tema, que tal a explicação da diferença entre Thread e sub-processo? rss

    Mais uma vez, parabéns!
    Denis

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *