Banco de Dados

Ξ Deixe um comentário

Monitorando a execução de programas PL/SQL

publicado por Paulo Planez

Figura - Monitorando a execução de programas PL/SQLUma 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]

Autor

Graduado em administração com especialização em Finanças, atua desde 1990 com sistemas de informação, em sua maioria focado em sistemas de gestão financeira. ♪ Atuou com sistemas de informação proprietários dos mais variados como Sistemas de gestão de Grãos, Sistemas de controle financeiro para transações eletrônicas e, no segmento de governo, com Sistemas Financeiros e de Sanidade Animal e Vegetal e com sistemas para processamento de Malha Fiscal. ♪ Atua por mais de 15 anos com sistemas de gestão (ERP) cobrindo ciclos operacionais como "Quote to Cash" e "Purchase to Pay" utilizando software da Oracle Corporation (Oracle EBS) em empresas como Globo, Motorola, Alcoa e Dell. ♪ Possui como linha de estudo e pesquisa a economicidade dos sistemas de informação, de modo a extrair destes o máximo de benefícios com o mínimo de recursos.♪ Contato: paulo.planez@gmail.com

Paulo Planez

Comentários

You must be logged in to post a comment.

Busca

Patrocínio

Publicidade



Siga-nos!

Newsletter: Inscreva-se

Para se inscrever em nossa newsletter preencha o formulário.

Artigos Recentes