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: 1
Agora, 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: 1
Finalizar 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.8318
Agora, 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.56636
Prosseguir 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