Depuración de PLSQL con SQLDeveloper

Índice

1. Ejemplo

1.1. Diagrama de flujo

sqldeveloper-flujo-mcd.svg

1.2. Código PLSQL

create or replace function MCD(n1 number,n2 number) return number
is
   a number;
   b number;
   res number;
begin 
    if (n1>n2) then
        a := n1;
        b := n2;
    else  
        a := n2;
        b := n1;
    end if;
    
    while( b!=0 ) loop
        res := b;
        b := mod(a,b);
        a := res;
    end loop; 
    
    return res;
end;
/

1.3. Lista de procedimientos y funciones

sqldeveloper-funciones-definidas.png

1.4. Compilar para depurar

  • Para poder depurar, debe compilare para depurar
  • Si no, los breakpoints no funcionarán

sqldeveloper-compilar-para-debug.png

1.5. Poner un breakpoint

  • Un breakpoint es una línea donde la ejecución parará temporalmente para poder inspeccionar el estado de las variables
  • f5 o botón derecho sobre los números de línea

sqldeveloper-poner-breakpoint.png

1.6. Bloque de invocación

  • Es un bloque anónimo que invocará a la función/procedimiento
  • Permite introducir valor a los parámetros de entrada, y recoger parámetros de salida y retorno de la función

sqldeveloper-bloque-para-debuguear.png

1.7. Avance del programa

sqldeveloper-avance-programa.png

  • Abortar la ejecución
  • Colocar el cursor en la siguiente instrucción a ejecutar
  • Step over F8: Ejecutar la siguiente línea, sin entrar en funciones
  • Step into F7: Ejecutar la siguiente línea, entrando en funciones
  • Step out: Ejecutar hasta acabar la función actual
  • Continuar hasta siguiente breakpoint F9
  • Parar la ejecución y comenzar a debuguear
  • Deshabilitar todos los breakpoints

1.8. Ventana Data

  • Contiene el valor de las variables de la función/procedimiento
  • Su valor se irá actualizando cuando avance el programa

sqldeveloper-ventana-data.png

2. Habilitar el debug

  • Privilegios
  • Habilitar puestos de depuración
  • Modo DBMS_DEBUG en vez de DBMS_DEBUG_JDWP (evita conexión inversa desde el servidor)

2.1. Privilegios

Executing PL/SQL: ALTER SESSION SET PLSQL_DEBUG=TRUE
Executing PL/SQL: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '192.168.1.119', '34685' )
ORA-01031: insufficient privileges
ORA-06512: at "SYS.DBMS_DEBUG_JDWP", line 68
ORA-06512: at line 1
This session requires DEBUG CONNECT SESSION and DEBUG ANY PROCEDURE user privileges.
grant debug connect session to USUARIOQUEDEBUGEA; 
grant debug any procedure to USUARIOQUEDEBUGEA;

2.2. Habilitar puestos de depuración

  • La instancia de Oracle puede limitar los ordenadores que pueden debuguear
begin
    dbms_network_acl_admin.append_host_ace
        (host=>'IP DEL CLIENTE QUE DEBUGUEA',
         ace=> sys.xs$ace_type( privilege_list=>sys.XS$NAME_LIST('JDWP') ,
                                principal_name=>'USUARIO QUE DEBUGUEA',
                                principal_type=>sys.XS_ACL.PTYPE_DB) );
end;
/

grant execute on DBMS_DEBUG_JDWP to USUARIOQUEDEBUGEA;

3. Alternativas a depurar

  • No siempre es fácil depurar
  • No se puede volver atrás al depurar
  • Con algo de práctica, las trazas pueden ser más útiles

3.1. Ejemplo con trazas

create or replace function MCD(n1 number,n2 number) return number
is
   a number;
   b number;
   res number;
begin 
    if (n1>n2) then
        dbms_output.put_line( 'n1 es mayor' );
        a := n1;
        b := n2;
    else 
        dbms_output.put_line( 'n2 es mayor' );
        a := n2;
        b := n1;
    end if;
    
    while( b!=0 ) loop
        dbms_output.put_line( 'Al principio: a:' || a || ' b: ' || b );
        res := b;
        b := mod(a,b);
        a := res;
        dbms_output.put_line( 'Al final:     a:' || a || '  b: ' || b );
    end loop; 
    
    dbms_output.put_line( 'retorno:' || res );

    return res;
end;

3.2. Ejemplo con trazas

sqldeveloper-trazas.png

4. Referencias

Autor: Álvaro González Sotillo

Created: 2024-09-08 dom 17:51

Validate