Можно ли узнать, из какого пакета была вызвана процедура? - PullRequest
1 голос
/ 21 апреля 2009

Предположим, у меня есть 2 пакета: A и B.

В пакете A я вызываю процедуру в пакете B.

В процедуре пакета B можно узнать, что процедура была вызвана из пакета A?


Большое спасибо за эту информацию. Это было очень поучительно.

Я ценю.

Ответы [ 3 ]

4 голосов
/ 22 апреля 2009

Вы можете использовать процедуру под названием who_called_me из пакета, поставляемого Oracle OWA_UTIL

http://download.oracle.com/docs/cd/B25221_04/web.1013/b25598/psutil.htm#i1006497

3 голосов
/ 21 апреля 2009

Вы можете передать имя в качестве параметра?

Использование ....

$$PLSQL_UNIT

От: http://awads.net/wp/2006/08/03/heres-a-quick-way-to-get-the-line-number-in-plsql

EDDIE@XE> CREATE OR REPLACE PACKAGE my_pkg
  2  IS
  3     PROCEDURE my_proc;
  4  END;
  5  /

Package created.

EDDIE@XE> CREATE OR REPLACE PACKAGE BODY my_pkg
  2  IS
  3     PROCEDURE my_proc
  4     IS
  5     BEGIN
  6        DBMS_OUTPUT.put_line ('Line number: ' || $$plsql_line);
  7        DBMS_OUTPUT.put_line (   'Unit: '
  8                              || $$plsql_unit
  9                             );
 10     END;
 11  END;
 12  /

Package body created.

EDDIE@XE> exec my_pkg.my_proc;
Line number: 6
Unit: MY_PKG
3 голосов
/ 21 апреля 2009

Возможно, вы сможете проанализировать текст, возвращенный функцией DBMS_UTILITY.FORMAT_CALL_STACK().

Редактировать: я пытался создать несколько тестовых пакетов. У меня есть процедура в пакете XX_TESTA, вызывающая другую в пакете XX_TESTB. Процедура в XX_TESTB просто печатает текст, возвращенный DBMS_UTILITY.FORMAT_CALL_STACK() для вывода. Это результирующий текст:

----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
416fe0e68         5  package body APPS.XX_TESTB
415182f10         5  package body APPS.XX_TESTA
416e9b448         3  anonymous block
...