在12c中,当前的子程序名称只是:
utl_call_stack.subprogram(1)(2);
目前的包装也可以从中获得
utl_call_stack.subprogram(1)(1);
但通常使用$$plsql_unit更容易.您还可以获取限定名称(package.procedure):
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
但是,我想不出任何过程或函数(或对象方法)需要自己名称的情况.此功能在日志记录过程中非常有用,在这种情况下,“谁给我打电话?”代码应该在记录器中,而不是在每个调用它的东西中重复.因此,我强烈建议避免任何“我是谁?”程序中的逻辑.相反,在你的记录器中放置这样的东西(需要12.1或更高版本):
create or replace procedure logdemo
as
k_calling_package constant varchar2(30) := utl_call_stack.subprogram(2)(1);
k_calling_subprog constant varchar2(30) := utl_call_stack.subprogram(2)(2);
begin
dbms_output.put_line
( $$plsql_unit ||
' called from package '||k_calling_package||', subprogram '||k_calling_subprog );
end logdemo;
不幸的是,它在11g中稍微复杂一点,因为你必须解析dbms_utility.format_call_stack,因为这只给你包名和行号(在换行分隔的文本字符串中),你必须查询all_source以找到子程序名称.
如果你澄清它是什么,我可以发布一些11g代码.在我的11g记录器中,我发现根据sqlcode等捕获dbms_utility.format_error_backtrace以及dbms_utility.format_call_stack很有用,因此有一堆特定于日志记录的逻辑,如果你只是想捕获当前值,则可能不需要程序名称由于其他原因.