Подтвердить что ты не робот

Получить имя вызывающей процедуры или функции в Oracle PL/SQL

Кто-нибудь знает, возможно ли для PL/SQL-процедуры (в этом случае регистрировать ошибки) получить имя вызываемой функции/процедуры?

Очевидно, что я мог бы передать имя в качестве параметра, но было бы неплохо сделать системный вызов или что-то получить информацию - он мог бы просто вернуть нуль или что-то, если он не был вызван из процедуры/функции.

Если для этого нет никакого метода - просто любопытно, если это возможно (поиски ничего не дают).

4b9b3361

Ответ 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]>