2011-08-11 43 views
19

A veces la excepción devuelve algo así como: "ORA-06502: PL/SQL: error numérico o de valor: búfer de cadena de caracteres demasiado pequeño".Oracle PL/SQL: cómo obtener la pila, el nombre del paquete y el nombre del procedimiento

No es tan legible ya que no informa la tabla, la columna y el valor que intentó escribir.

sería útil obtener el nombre del procedimiento actual en el momento en que se produjo la excepción o está atrapado.

¿Cómo puedo obtener eso?

Respuesta

31

es probable que desee DBMS_UTILITY.FORMAT_ERROR_BACKTRACE función

SQL> ed 
Wrote file afiedt.buf 

    1 create or replace procedure p1 
    2 is 
    3 begin 
    4 raise_application_error(-20001, 'Error 1', true); 
    5* end; 
SQL>/

Procedure created. 

SQL> create or replace procedure p2 
    2 as 
    3 begin 
    4 null; 
    5 p1; 
    6 end; 
    7/

Procedure created. 

SQL> begin 
    2 p2; 
    3 exception 
    4 when others then 
    5  dbms_output.put_line(dbms_utility.format_error_backtrace); 
    6 end; 
    7/
ORA-06512: at "SCOTT.P1", line 4 
ORA-06512: at "SCOTT.P2", line 5 
ORA-06512: at 
line 2 


PL/SQL procedure successfully completed. 
3

utilizo la combinación de DBMS_UTILITY.FORMAT_ERROR_STACK y DBMS_UTILITY.FORMAT_ERROR_BACKTRACE. (La mejora de la respuesta de Justin cueva)

when others then 
    Dbms_Output.put_line (DBMS_UTILITY.FORMAT_ERROR_STACK()); 
    Dbms_Output.put_line (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()); 

Esto le da al error en la primera línea y la pila en las siguientes líneas: (salida del ejemplo dado por Justin cueva)

ORA-20001: Error 1 
ORA-06512: at "SCOTT.X1", line 4 
ORA-06512: at "SCOTT.X2", line 5 
ORA-06512: at line 2 
+0

Mejor uso DBMS_OUTPUT .PUT, ya que el error stack/trace ya contiene un nuevo carácter de línea. – lav

Cuestiones relacionadas