Получить имя вызывающей процедуры или функции в Oracle PL/SQL
Кто-нибудь знает, возможно ли для PL/SQL-процедуры (в этом случае регистрировать ошибки) получить имя вызываемой функции/процедуры?
Очевидно, что я мог бы передать имя в качестве параметра, но было бы неплохо сделать системный вызов или что-то получить информацию - он мог бы просто вернуть нуль или что-то, если он не был вызван из процедуры/функции.
Если для этого нет никакого метода - просто любопытно, если это возможно (поиски ничего не дают).
Ответы
Ответ 1
Существует пакет под названием OWA_UTIL
(который не установлен по умолчанию в старых версиях базы данных). У этого метода есть метод WHO_CALLED_ME()
, который возвращает OWNER, OBJECT_NAME, LINE_NO и CALLER_TYPE. Обратите внимание: если вызывающий абонент представляет собой упакованную процедуру, он возвращает имя PACKAGE, а не имя процедуры. В этом случае нет способа получить имя процедуры; это потому, что имя процедуры может быть перегружено, поэтому оно не обязательно очень полезно.
Узнайте больше.
Так как 10gR2 также есть специальная функция $$PLSQL_UNIT
; это также вернет ИМЯ ОБЪЕКТА (т.е. пакет не упакованная процедура).
Ответ 2
Я нашел этот форум: http://www.orafaq.com/forum/t/60583/0/. Возможно, это то, что вы ищете.
В принципе, вы можете использовать поставляемый Oracle 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]>