加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

目前在Oracle中的包中执行过程名称

发布时间:2020-12-12 12:55:08 所属栏目:百科 来源:网络整理
导读:有没有办法在Oracle中的包中获取当前正在执行的过程名称? create or replace package test_pkgas procedure proc1;end test_pkg;create or replace package body test_pkgas procedure proc1 is -- // Get the Procedure Name here?? // end proc1;end test
有没有办法在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很有用,因此有一堆特定于日志记录的逻辑,如果你只是想捕获当前值,则可能不需要程序名称由于其他原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读