目前在Oracle中的包中执行过程名称
有没有办法在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很有用,因此有一堆特定于日志记录的逻辑,如果你只是想捕获当前值,则可能不需要程序名称由于其他原因. (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |