Uma coisa muito interessante em programas Oracle PL/SQL é a possibilidade de se monitorar a execução de um programa para saber o que ele esta fazendo em um determinado momento. Este artigo tem por finalidade ajudar a criar pontos de monitoramento que permitam saber em que passo da execução um determinado programa se encontra. A “procedure” abaixo vai fazer uma leitura básica de tabelas e contar campos. Ela será utilizada para demonstrar o recurso de monitoramento. Crie a “procedure” abaixo para executar o teste:
create or replace procedure plz_monitora is BEGIN ----------------------------------------------------------------------------- --> Nomeando o processo ----------------------------------------------------------------------------- DBMS_APPLICATION_INFO.set_module('PLZ_MONITORA',null); ----------------------------------------------------------------------------- --> Iniciando o processo ----------------------------------------------------------------------------- DECLARE -------------------------------------------------------------------------- --> Variaveis auxiliares -------------------------------------------------------------------------- v_cnt number := 0; v_col number; -------------------------------------------------------------------------- --> Array de tabelas -------------------------------------------------------------------------- type r_tab is record (owner varchar2(30) ,tabela varchar2(30)); type t_tab is table of r_tab index by binary_integer; v_tab t_tab; BEGIN -------------------------------------------------------------------------- --> Alimentando o array -------------------------------------------------------------------------- select owner, table_name bulk collect into v_tab from ALL_TABLES order by owner, table_name; -------------------------------------------------------------------------- --> nomeando ação -------------------------------------------------------------------------- DBMS_APPLICATION_INFO.set_module('PLZ_MONITORA','Processando'); -------------------------------------------------------------------------- --> Iniciando o processamento -------------------------------------------------------------------------- FOR x IN 1..V_TAB.count LOOP ----------------------------------------------------------------------- --> Contando os registros processados ----------------------------------------------------------------------- v_cnt := v_cnt + 1; ----------------------------------------------------------------------- --> Mostrando situação do processamento ----------------------------------------------------------------------- DBMS_APPLICATION_INFO.set_client_info ('Processando registro '||x||' de '||V_TAB.count); ----------------------------------------------------------------------- --> Sleep da 10s para permitir melhor visualização do teste --> Habilite se necessário ----------------------------------------------------------------------- --DBMS_LOCK.sleep (10); ----------------------------------------------------------------------- --> Contando as colunas da tabela ----------------------------------------------------------------------- select count(*) into v_col from ALL_TAB_COLUMNS where owner = V_TAB(x).owner and table_name = V_TAB(x).tabela; END LOOP; END; ----------------------------------------------------------------------------- --> Eliminando a nomeação ----------------------------------------------------------------------------- DBMS_APPLICATION_INFO.set_module(null,null); DBMS_APPLICATION_INFO.set_client_info (null); END plz_monitora;
O ponto-chave nesse programa é a função DBMS_APPLICATION_INFO. Abaixo uma explicação das funções:
DBMS_APPLICATION_INFO.set_module
– Vai nomear o modulo e a ação em execução.
DBMS_APPLICATION_INFO.set_client_info
– Vai adicionar uma informação sobre a execução.
Para visualizarmos estas mensagens, podemos executar a ”query” abaixo:
select module, action, client_info from v$session where module = 'PLZ_MONITORA';
Agora, vamos executar o processo e visualizar a execução. Abra duas sessões, uma com um usuário administrativo, que permita a visualização das sessões, e outra com um usuário do sistema onde você criou a “procedure” para testes. Coloque para rodar a “procedure” para testes e execute a “query” de visualização várias vezes para ver o andamento do processamento.
O objetivo deste recurso é melhorar a qualidade do monitoramento que é aplicado ao banco, permitindo identificar de forma mais fácil todos os programas que estão sendo executados no momento bem como os recursos consumidos por esta execução sem a necessidade de criação de alguma tabela temporária que armazene detalhes de processamento.
A chamada a estes procedimentos pode ser incluída em outros programas como Java, PHP, C++, etc.
Importante
Apesar de o modelo criado mostrar o número de registros processados, essa não é uma boa prática, especialmente se o número de ciclos dentro do laço for muito grande. Isso poderá gerar problemas de desempenho no banco de dados como um todo.
Minha recomendação é que se coloque no começo do programa uma chamada à função para nomear o processo e no fim do programa para limpar a nomeação. Em raros casos que envolvam poucos registros, coloque dentro de um laço.
[Crédito da Imagem: PL/SQL – ShutterStock]
You must be logged in to post a comment.