有没有办法在Oracle中的包中获取当前正在执行的过程名称?
create or replace package test_pkg as procedure proc1; end test_pkg; create or replace package body test_pkg as procedure proc1 is -- // Get the Procedure Name here?? // end proc1; end test_pkg;
解决方法
在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很有用,因此有一堆特定于日志记录的逻辑,如果你只是想捕获当前值,则可能不需要程序名称由于其他原因.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。