PL/SQLプロシージャ(この場合はエラーをログに記録するプロシージャ)が、それを呼び出した関数/プロシージャの名前を取得できるかどうか誰かが知っていますか?
明らかに、名前をパラメーターとして渡すことができますが、情報を取得するためにシステムコールまたは何かを行うのはいいことです。プロシージャまたは関数から呼び出されなかった場合は、nullまたは何かを返すだけです。
これに対する方法がない場合は問題ありません-可能であれば好奇心旺盛です(検索で何も得られません)。
_OWA_UTIL
_というパッケージがあります(古いバージョンのデータベースにはデフォルトでインストールされていません)。これには、OWNER、OBJECT_NAME、LINE_NO、およびCALLER_TYPEを返すメソッドWHO_CALLED_ME()
があります。呼び出し元がパッケージプロシージャの場合、プロシージャ名ではなくパッケージ名を返すことに注意してください。この場合、プロシージャ名を取得する方法はありません。これは、プロシージャ名がオーバーロードされる可能性があるためです。そのため、必ずしもあまり有用ではありません。
詳細 。
10gR2以降、_$$PLSQL_UNIT
_特殊関数もあります。これにより、オブジェクト名も返されます(つまり、パッケージプロシージャではないパッケージ)。
私はこのフォーラムを見つけました: http://www.orafaq.com/forum/t/60583/0/ 。それはあなたが探しているものかもしれません。
基本的に、Oracle提供のdbms_utility.format_call_stack
:
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>