如果您只对调用过程感兴趣,可以使用简短示例: DBMS_OUTPUT.PUT_LINE(UTL_Call_Stack.Concatenate_Subprogram(UTL_Call_Stack.Subprogram(2)));
或者打印完整的调用堆栈:
FOR j IN REVERSE 1..UTL_Call_Stack.Dynamic_Depth() LOOP
DBMS_OUTPUT.PUT_LINE(UTL_Call_Stack.Concatenate_Subprogram(UTL_Call_Stack.Subprogram(j)));
END LOOP;
包装示例:
CREATE OR REPLACE PACKAGE log_test IS
PROCEDURE write_exec_log(msg VARCHAR2);
PROCEDURE TestProc1;
PROCEDURE TestProc2;
PROCEDURE TestProc3;
END log_test;
/
CREATE OR REPLACE PACKAGE BODY log_test IS
PROCEDURE write_exec_log(msg VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(msg);
DBMS_OUTPUT.PUT_LINE('-- ');
DBMS_OUTPUT.PUT_LINE('calling procedure/function: '
||UTL_Call_Stack.Concatenate_Subprogram(
UTL_Call_Stack.Subprogram(2)
)
);
DBMS_OUTPUT.PUT_LINE('-- ');
DBMS_OUTPUT.PUT_LINE('Call Stack');
FOR j IN REVERSE 1..UTL_Call_Stack.Dynamic_Depth() LOOP
DBMS_OUTPUT.PUT_LINE(UTL_Call_Stack.Concatenate_Subprogram(
UTL_Call_Stack.Subprogram(j)
)
);
END LOOP;
END write_exec_log;
PROCEDURE TestProc1 IS
BEGIN
write_exec_log( 'msg TestProc1' );
END TestProc1;
PROCEDURE TestProc2 IS
BEGIN
write_exec_log( 'msg TestProc2' );
END TestProc2;
PROCEDURE TestProc3 IS
BEGIN
TestProc2;
END TestProc3;
END log_test;
/
exec log_test.TestProc1
exec log_test.TestProc2
exec log_test.TestProc3
(对不起,写完时没有sqlfiddle,没有12c)