CREATE OR REPLACE PACKAGE pkg1 AUTHID DEFINER
IS
PROCEDURE proc1;
END pkg1;
Down to Subprogram Name!
CREATE OR REPLACE PACKAGE BODY pkg1
IS
PROCEDURE proc1
IS
PROCEDURE nested_in_proc1
IS
BEGIN
DBMS_OUTPUT.put_line (
'*** "Traditional" Call Stack using FORMAT_CALL_STACK');
DBMS_OUTPUT.put_line (DBMS_UTILITY.format_call_stack);
DBMS_OUTPUT.put_line (
'*** Fully Qualified Nested Subprogram vis UTL_CALL_STACK');
DBMS_OUTPUT.put_line (
utl_call_stack.concatenate_subprogram (
utl_call_stack.subprogram (1)));
END;
BEGIN
nested_in_proc1;
END;
END pkg1;
The Call Stack Output
BEGIN
pkg1.proc1;
END;
Backtrace Info, Too!
CREATE OR REPLACE FUNCTION backtrace_to
RETURN VARCHAR2 AUTHID DEFINER
IS
BEGIN
RETURN
utl_call_stack.backtrace_unit (
utl_call_stack.backtrace_depth)
|| ' line '
|| utl_call_stack.backtrace_line (
utl_call_stack.backtrace_depth);
END;
CREATE OR REPLACE PACKAGE pkg1 AUTHID DEFINER
IS
PROCEDURE proc1;
PROCEDURE proc2;
END;
CREATE OR REPLACE PACKAGE BODY pkg1
IS
PROCEDURE proc1
IS
PROCEDURE nested_in_proc1
IS
BEGIN
RAISE VALUE_ERROR;
END;
BEGIN
nested_in_proc1;
END;
PROCEDURE proc2
IS
BEGIN
proc1;
EXCEPTION
WHEN OTHERS
THEN
RAISE NO_DATA_FOUND;
END;
END pkg1;
CREATE OR REPLACE PROCEDURE proc3 AUTHID DEFINER
IS
BEGIN
pkg1.proc2;
END;
BEGIN
proc3;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (backtrace_to);
END;