O objetivo deste artigo e apresentar o pacote DBMS_APPLICATION_INFO do Oracle 11g R2. O pacote DBMS_APPLICATION_INFO permite o desenvolvedor adicionar informacoes que permitem e facilitam o rastreamento do SQL. Essas informacoes aproximam o administrador de banco de dados (DBA) e o desenvolvedor tornando simples e facil a comunicacao.A visao V$SESSION possui os seguintes campos que sao utilizados para fazer o rastreamento do SQL:MODULE e um varchar2(48) que e utilizado para registrar o nome do aplicativo que esta sendo executado.ACTION e um varchar2(32) que representa a funcionalidade que esta sendo executada pelo aplicativo.Como os campos sao varchar2, qualquer informacao interessante pode ser adicionada, como por exemplo: sistema, usuario do sistema, nome do relatorio, ip do cliente, maquina do cliente, ou qualquer outra informacao que ajudara a identificacao. Essas informacoes podem ser consultadas tambem nas visoes V$SQLAREA e V$SESSION_LONGOPS.A ideia do rastreamento e para cada SQL executado, mapear o contexto, desta forma o DBA conseguira com precisao identificar os SQL relacionados as funcionalidades que estao sendo executadas. Possibilitando o DBA desenvolver um relatorio tecnico sugerindo modificacoes na aplicacao para o desenvolvedor.Pacote DBMS_APPLICATION_INFOCREATE OR REPLACE PACKAGE SYS.DBMS_APPLICATION_INFO IS PROCEDURE SET_MODULE(MODULE_NAME VARCHAR2, ACTION_NAME VARCHAR2); PROCEDURE SET_ACTION(ACTION_NAME VARCHAR2); PROCEDURE READ_MODULE(MODULE_NAME OUT VARCHAR2, ACTION_NAME OUT VARCHAR2); PROCEDURE SET_CLIENT_INFO(CLIENT_INFO VARCHAR2); PROCEDURE READ_CLIENT_INFO(CLIENT_INFO OUT VARCHAR2); PROCEDURE SET_SESSION_LONGOPS(RINDEX IN OUT PLS_INTEGER, SLNO IN OUT PLS_INTEGER, OP_NAME IN VARCHAR2 DEFAULT NULL, TARGET IN PLS_INTEGER DEFAULT 0, CONTEXT IN PLS_INTEGER DEFAULT 0, SOFAR IN NUMBER DEFAULT 0, TOTALWORK IN NUMBER DEFAULT 0, TARGET_DESC IN VARCHAR2 DEFAULT 'UNKNOWN TARGET', UNITS IN VARCHAR2 DEFAULT NULL); SET_SESSION_LONGOPS_NOHINT CONSTANT PLS_INTEGER := -1; PRAGMA TIMESTAMP('1998-03-12:12:00:00');END; Procedimento Descricao SET_MODULE Define o nome do aplicativo que esta sendo executado SET_ACTION Define a funcionalidade que esta sendo executada pelo aplicativo READ_MODULE Retorna o MODULE e ACTION da sessao corrente SET_CLIENT_INFO Define o campo client_info da sessao corrente READ_CLIENT_INFO Retorna o campo client_info da sessao corrente SET_SESSION_LONGOPS Define uma linha em V$SESSION_LONGOPSSET_MODULEUma vez conectado no banco, registre o nome do aplicativo: SQL> EXEC DBMS_APPLICATION_INFO.SET_MODULE('SCOTT',NULL); PL/SQL procedure successfully completedSET_ACTIONPara cada SQL executado, registre uma descricao: SQL> EXEC DBMS_APPLICATION_INFO.SET_ACTION('CADASTRANDO EMPREGADO'); PL/SQL procedure successfully completedREAD_MODULECaso precise retornar as informacoes registradas: SQL> SET SERVEROUTPUT ONSQL> DECLARE 2 L_MODULO VARCHAR2(48); 3 L_ACAO VARCHAR2(32); 4 BEGIN 5 DBMS_APPLICATION_INFO.READ_MODULE(L_MODULO,L_ACAO); 6 DBMS_OUTPUT.PUT_LINE('MODULO: '||L_MODULO); 7 DBMS_OUTPUT.PUT_LINE('ACAO: '||L_ACAO); 8 END; 9 / MODULO: SCOTTACAO: CADASTRANDO EMPREGADO PL/SQL procedure successfully completedSET_CLIENT_INFORegistre informacoes do cliente, enriquecendo o contexto: SQL> DECLARE 2 L_CLIENT_INFO VARCHAR2(64); 3 BEGIN 4 SELECT 'HOSTNAME: '||SYS_CONTEXT('USERENV', 'TERMINAL') 5 ||' IP: '||SYS_CONTEXT('USERENV', 'IP_ADDRESS') 6 ||' USUARIO_SO: '||SYS_CONTEXT('USERENV', 'OS_USER') 7 INTO L_CLIENT_INFO 8 FROM DUAL; 9 DBMS_APPLICATION_INFO.SET_CLIENT_INFO(L_CLIENT_INFO); 10 END; 11 / PL/SQL procedure successfully completedREAD_CLIENT_INFOConsulte as informacoes registrada do cliente: SQL> SET SERVEROUTPUT ONSQL> DECLARE 2 L_CLIENT_INFO VARCHAR2(64); 3 BEGIN 4 DBMS_APPLICATION_INFO.READ_CLIENT_INFO(L_CLIENT_INFO); 5 DBMS_OUTPUT.PUT_LINE(L_CLIENT_INFO); 6 END; 7 / HOSTNAME: PC-SAKAMOTO IP: 10.1.1.2 USUARIO_SO: Sakamoto PL/SQL procedure successfully completedEssas informacoes podem ser consultadas tambem pelo campo client_info visao V$SESSION. O campo client_info e uma varchar2(64). SET_SESSION_LONGOPSPara operacoes longas e demoradas, e possivel monitorar e acompanhar a progressao: SQL> DECLARE 2 L_RINDEX BINARY_INTEGER; 3 L_SLNO BINARY_INTEGER; 4 L_TOTALWORK NUMBER; 5 L_SOFAR NUMBER; 6 L_OBJ BINARY_INTEGER; 7 BEGIN 8 L_RINDEX := DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS_NOHINT; 9 L_SOFAR := 0;