2011-09-01 26 views
16

¿Alguien sabe si es posible para un procedimiento PL/SQL (un error de registro en este caso) obtener el nombre de la función/procedimiento que llamó ¿eso?Obtenga el nombre del procedimiento o función de llamada en Oracle PL/SQL

Obviamente, podría pasar el nombre como parámetro, pero sería bueno hacer una llamada al sistema o algo para obtener la información; podría devolver un valor nulo o algo si no se llamó desde un procedimiento/función.

Si no hay un método para esto, está bien, solo curiosidad si es posible (las búsquedas no producen nada).

+0

@APC Gracias a ambos por sus sugerencias. He investigado el proceso who_called_me en el paquete OWA_Util y la función format_call_stack. Definitivamente usaré el procedimiento who_called_me. Algunas búsquedas mostraron que hay formas potenciales (pero no infalibles) de obtener el nombre real de la función/proc. (ver aquí: [enlace] (http://tkyte.blogspot.com/2009/10) /httpasktomoraclecomtkytewhocalledme.html). ¡También puedo agregar la pila de llamadas también, dependiendo de cuán "profunda" es esta aplicación! Saludos, Paul –

+0

PD - si alguien pudiera decirme cómo formatear mi comentario anterior, le agradecería, lo intenté varias veces con referencia a la guía 'markdown', ¡pero no puedo mostrar los saltos de línea! –

Respuesta

15

Hay un paquete llamado OWA_UTIL (que no se instala por defecto en las versiones anteriores de la base de datos). Tiene un método WHO_CALLED_ME() que devuelve el PROPIETARIO, OBJECT_NAME, LINE_NO y CALLER_TYPE. Tenga en cuenta que si la persona que llama es un procedimiento empaquetado, devolverá el nombre PAQUETE no el nombre del procedimiento. En este caso, no hay forma de obtener el nombre del procedimiento; esto se debe a que el nombre del procedimiento puede estar sobrecargado, por lo que no es necesariamente muy útil.

Find out more.


Desde 10gR2 También existe la función especial $$PLSQL_UNIT; esto también devolverá el NOMBRE DEL OBJETO (es decir, el procedimiento del paquete no empaquetado).

11

Encontré este foro: http://www.orafaq.com/forum/t/60583/0/. Puede ser lo que estás buscando.

Básicamente, se puede utilizar el Oracle suministra dbms_utility.format_call_stack:

[email protected]> CREATE TABLE error_tab 
    2 (who_am_i  VARCHAR2(61), 
    3  who_called_me VARCHAR2(61), 
    4  call_stack CLOB) 
    5/

Table created. 

[email protected]> 
[email protected]> CREATE OR REPLACE PROCEDURE d 
    2 AS 
    3 v_num  NUMBER; 
    4 v_owner VARCHAR2(30); 
    5 v_name  VARCHAR2(30); 
    6 v_line  NUMBER; 
    7 v_caller_t VARCHAR2(100); 
    8 BEGIN 
    9 select to_number('a') into v_num from dual; -- cause error for testing 
10 EXCEPTION 
11 WHEN OTHERS THEN 
12  who_called_me (v_owner, v_name, v_line, v_caller_t); 
13  INSERT INTO error_tab 
14  VALUES (who_am_i, 
15   v_owner || '.' || v_name, 
16   dbms_utility.format_call_stack); 
17 END d; 
18/

Procedure created. 

[email protected]> SHOW ERRORS 
No errors. 
[email protected]> CREATE OR REPLACE PROCEDURE c 
    2 AS 
    3 BEGIN 
    4 d; 
    5 END c; 
    6/

Procedure created. 

[email protected]> CREATE OR REPLACE PROCEDURE b 
    2 AS 
    3 BEGIN 
    4 c; 
    5 END b; 
    6/

Procedure created. 

[email protected]> CREATE OR REPLACE PROCEDURE a 
    2 AS 
    3 BEGIN 
    4 b; 
    5 END a; 
    6/

Procedure created. 

[email protected]> execute a 

PL/SQL procedure successfully completed. 

[email protected]> COLUMN who_am_i FORMAT A13 
[email protected]> COLUMN who_called_me FORMAT A13 
[email protected]> COLUMN call_stack FORMAT A45 
[email protected]> SELECT * FROM error_tab 
    2/

WHO_AM_I  WHO_CALLED_ME CALL_STACK 
------------- ------------- --------------------------------------------- 
SCOTT.D  SCOTT.C  ----- PL/SQL Call Stack ----- 
           object  line object 
           handle number name 
          6623F488   1 anonymous block 
          66292138  13 procedure SCOTT.D 
          66299430   4 procedure SCOTT.C 
          6623D2F8   4 procedure SCOTT.B 
          6624F994   4 procedure SCOTT.A 
          66299984   1 anonymous block 


[email protected]> 
Cuestiones relacionadas