salida - procedimientos y funciones oracle pl/sql
Obtenga el nombre del procedimiento o funciĆ³n de llamada en Oracle PL/SQL (2)
¿Alguien sabe si es posible que un procedimiento PL / SQL (un registro de error en este caso) obtenga el nombre de la función / procedimiento que lo llamó?
Obviamente, podría pasar el nombre como un 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).
Hay un paquete llamado OWA_UTIL
(que no está instalado por defecto en 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.
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).
Encontré este foro: http://www.orafaq.com/forum/t/60583/0/ . Puede ser lo que estás buscando.
Básicamente, puede usar el dbms_utility.format_call_stack
suministrado por Oracle:
scott@ORA92> CREATE TABLE error_tab
2 (who_am_i VARCHAR2(61),
3 who_called_me VARCHAR2(61),
4 call_stack CLOB)
5 /
Table created.
scott@ORA92>
scott@ORA92> 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.
scott@ORA92> SHOW ERRORS
No errors.
scott@ORA92> CREATE OR REPLACE PROCEDURE c
2 AS
3 BEGIN
4 d;
5 END c;
6 /
Procedure created.
scott@ORA92> CREATE OR REPLACE PROCEDURE b
2 AS
3 BEGIN
4 c;
5 END b;
6 /
Procedure created.
scott@ORA92> CREATE OR REPLACE PROCEDURE a
2 AS
3 BEGIN
4 b;
5 END a;
6 /
Procedure created.
scott@ORA92> execute a
PL/SQL procedure successfully completed.
scott@ORA92> COLUMN who_am_i FORMAT A13
scott@ORA92> COLUMN who_called_me FORMAT A13
scott@ORA92> COLUMN call_stack FORMAT A45
scott@ORA92> 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
scott@ORA92>