DBMS_DEBUG no Oracle: Uma Visão Geral e Exemplos Práticos
O pacote DBMS_DEBUG é uma ferramenta poderosa para depuração de código PL/SQL no Oracle Database. Ele oferece um conjunto de procedures e funções que permitem aos desenvolvedores rastrear a execução de código, definir pontos de interrupção (breakpoints), inspecionar variáveis e controlar o fluxo de execução. Este artigo fornece uma visão geral do pacote DBMS_DEBUG no Oracle 19c, com exemplos práticos para ilustrar seu uso.
1. Introdução ao DBMS_DEBUG
O DBMS_DEBUG foi introduzido para fornecer uma interface de depuração programática para desenvolvedores PL/SQL. Embora ferramentas gráficas como o SQL Developer ofereçam recursos de depuração, o DBMS_DEBUG é útil em ambientes onde uma interface gráfica não está disponível ou em scripts automatizados.
2. Configuração Inicial
Antes de começar a usar o DBMS_DEBUG, é importante garantir que você tenha os privilégios adequados:
SQL> GRANT DEBUG CONNECT SESSION TO <usuário>;
SQL> GRANT DEBUG ANY PROCEDURE TO <usuário>;Esses privilégios permitem que o usuário conecte-se a sessões de depuração e depure qualquer procedure no banco de dados.
3. Exemplo Prático Simples
Vamos começar com um exemplo simples de uso do DBMS_DEBUG. Suponha que temos o seguinte procedure PL/SQL que queremos depurar:
SQL> CREATE OR REPLACE PROCEDURE exemplo_simples IS
v_num NUMBER := 0;
BEGIN
v_num := v_num + 1;
DBMS_OUTPUT.PUT_LINE('Valor de v_num: ' || v_num);
END exemplo_simples;
/SQL> EXEC exemplo_simples;
Valor de v_num: 1Agora, usaremos o DBMS_DEBUG para depurar essa procedure.
Iniciar a Sessão de Depuração:
SQL> DECLARE
2 v_session_id INTEGER;
3 v_serial_id INTEGER;
4 BEGIN
5 DBMS_DEBUG.DEBUG_ON;
6 DBMS_DEBUG.GET_SESSION_ID(v_session_id, v_serial_id);
7 END;
8 /
PL/SQL procedure successfully completed.Conectar à Sessão:
SQL> EXEC DBMS_DEBUG.CONNECT_SESSION(v_session_id, v_serial_id);
PL/SQL procedure successfully completed.Definir um Ponto de Interrupção (Breakpoint):
SQL> DECLARE
2 v_handle BINARY_INTEGER;
3 BEGIN
4 v_handle := DBMS_DEBUG.SET_BREAKPOINT('exemplo_simples', 3);
5 END;
6 /
PL/SQL procedure successfully completed.Executar a Procedure:
SQL> EXEC exemplo_simples;
PL/SQL procedure successfully completed.Verificar o Valor da Variável:
SQL> DECLARE
2 v_value BINARY_INTEGER;
3 BEGIN
4 v_value := DBMS_DEBUG.VALUE('v_num');
5 DBMS_OUTPUT.PUT_LINE('Valor de v_num no breakpoint: ' || v_value);
6 END;
7 /
Valor de v_num no breakpoint: 1Finalizar a Sessão de Depuração:
SQL> EXEC DBMS_DEBUG.DEBUG_OFF;
PL/SQL procedure successfully completed.4. Exemplo Prático Complexo
Vamos agora considerar um exemplo mais complexo onde depuramos um pacote que realiza cálculos mais elaborados. Suponha que temos um pacote chamado CALCULOS_COMPLEXOS com uma procedure que realiza uma série de operações aritméticas:
SQL> CREATE OR REPLACE PACKAGE calculos_complexos AS
PROCEDURE calcular_area_circulo(raio NUMBER);
PROCEDURE calcular_volume_cilindro(raio NUMBER, altura NUMBER);
END calculos_complexos;
/
SQL> CREATE OR REPLACE PACKAGE BODY calculos_complexos AS
PROCEDURE calcular_area_circulo(raio NUMBER) IS
v_area NUMBER;
BEGIN
v_area := 3.14159 * raio * raio;
DBMS_OUTPUT.PUT_LINE('Área do círculo: ' || v_area);
END calcular_area_circulo;
PROCEDURE calcular_volume_cilindro(raio NUMBER, altura NUMBER) IS
v_volume NUMBER;
BEGIN
calcular_area_circulo(raio);
v_volume := 3.14159 * raio * raio * altura;
DBMS_OUTPUT.PUT_LINE('Volume do cilindro: ' || v_volume);
END calcular_volume_cilindro;
END calculos_complexos;
/SQL> EXEC calculos_complexos.calcular_volume_cilindro(2, 5);
Área do círculo: 12.56636
Volume do cilindro: 62.8318Agora, vamos usar o DBMS_DEBUG para depurar a procedure calcular_volume_cilindro.
Iniciar a Sessão de Depuração:
SQL> DECLARE
2 v_session_id INTEGER;
3 v_serial_id INTEGER;
4 BEGIN
5 DBMS_DEBUG.DEBUG_ON;
6 DBMS_DEBUG.GET_SESSION_ID(v_session_id, v_serial_id);
7 END;
8 /
PL/SQL procedure successfully completed.Conectar à Sessão:
SQL> EXEC DBMS_DEBUG.CONNECT_SESSION(v_session_id, v_serial_id);
PL/SQL procedure successfully completed.Definir um Ponto de Interrupção na Procedure calcular_area_circulo:
SQL> DECLARE
2 v_handle BINARY_INTEGER;
3 BEGIN
4 v_handle := DBMS_DEBUG.SET_BREAKPOINT('calculos_complexos.calcular_area_circulo', 4);
5 END;
6 /
PL/SQL procedure successfully completed.Executar a Procedure calcular_volume_cilindro:
SQL> EXEC calculos_complexos.calcular_volume_cilindro(2, 5);
PL/SQL procedure successfully completed.Verificar os Valores das Variáveis no Breakpoint:
SQL> DECLARE
2 v_value BINARY_INTEGER;
3 BEGIN
4 v_value := DBMS_DEBUG.VALUE('v_area');
5 DBMS_OUTPUT.PUT_LINE('Valor de v_area no breakpoint: ' || v_value);
6 END;
7 /
Valor de v_area no breakpoint: 12.56636Prosseguir a Execução Após o Breakpoint:
SQL> EXEC DBMS_DEBUG.CONTINUE;
PL/SQL procedure successfully completed.Finalizar a Sessão de Depuração:
SQL> EXEC DBMS_DEBUG.DEBUG_OFF;
PL/SQL procedure successfully completed.5. Considerações Finais
O DBMS_DEBUG oferece um nível profundo de controle sobre a depuração de código PL/SQL, sendo especialmente útil em ambientes de produção onde o uso de ferramentas gráficas pode não ser viável. Ao dominar este pacote, os desenvolvedores podem melhorar significativamente a qualidade e a confiabilidade do código PL/SQL.
Embora o uso do DBMS_DEBUG possa parecer mais complexo do que as alternativas gráficas, ele é inestimável em cenários avançados de depuração, especialmente para resolver problemas que ocorrem em ambientes de produção onde as ferramentas gráficas não estão disponíveis.
Este artigo apresentou exemplos básicos e complexos para iniciar o uso do DBMS_DEBUG. À medida que os desenvolvedores se familiarizam com este pacote, podem explorar ainda mais suas capacidades para otimizar a depuração e a análise de código PL/SQL no Oracle 19c.
Abs
Referências
Legal! 🙂