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

oracle – PL / SQL我的功能类似于T-SQL的OBJECT_NAME(@@ PROCID

发布时间:2020-12-12 13:15:54 所属栏目:百科 来源:网络整理
导读:在T-SQL中,以下命令将返回当前运行的存储过程的名称: OBJECT_NAME(@@PROCID) 在PL / SQL中,当我将以下代码放在包的存储过程上时,它返回父包的名称而不是执行的存储过程. $$PLSQL_UNIT 有没有办法在PL / SQL中获取执行程序的名称? 解决方法 是的,在12之前的
在T-SQL中,以下命令将返回当前运行的存储过程的名称:

OBJECT_NAME(@@PROCID)

在PL / SQL中,当我将以下代码放在包的存储过程上时,它返回父包的名称而不是执行的存储过程.

$$PLSQL_UNIT

有没有办法在PL / SQL中获取执行程序的名称?

解决方法

是的,在12之前的版本中它是不可能的.但是你可以尝试一些黑客攻击.

> V $SESSION视图具有PLSQL_ENTRY_SUBPROGRAM_ID和PLSQL_SUBPROGRAM_ID字段,可以引导您进入当前正在执行的过程.

本届会议是:

select PLSQL_ENTRY_OBJECT_ID,PLSQL_ENTRY_SUBPROGRAM_ID,PLSQL_OBJECT_ID,PLSQL_SUBPROGRAM_ID
from V$SESSION
where AUDSID = sys_context( 'userenv','sessionid' )

然后通过查询视图ALL_PROCEDURES找到过程名称:

select PROCEDURE_NAME
from ALL_PROCEDURES
where OBJECT_ID = :objectId
  and SUBPROGRAM_ID = :subprogramId

此视图包含在包中声明的函数和过程,但不包含在包体中声明的函数和过程.

> dbms_utility.format_call_stack显示行号和源名称.可以通过owa_util.who_called_me获得解析输出.原始输出还包含对象句柄,可以让您访问匿名块的源代码.

dbms_utility.format_call_stack示例输出:

----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
B87FEF1C         1  anonymous block

然后:

select SQL_FULLTEXT from V$SQL where CHILD_ADDRESS = 'B87FEF1C'

存储过程的源代码可以从ALL_SOURCE获得.

>一旦获得了调用方法的源代码和该代码中的行号,就可以解析它以获取过程名称.

唯一不好的例子是单行.但这是一种罕见的情况.

procedure outer is procedure inner is begin whoami; end; begin whoami; end;

您有关于此行调用whoami的信息.但你不知道它是第一次出现还是第二次出现.因此,即使解析源代码也无法引导您找到确切的解决方案.

可以通过解析源代码来处理其他情况. Here是我的尝试.样品用法:

create package APCKG is
  procedure PROC;
end;
/
create package body APCKG is
  procedure PROC is
    procedure "INNER/proc" is
    begin
      dbms_output.put_line( p_stack.whoAmI );
    end;
  begin
    "INNER/proc";
  end;
end;
/
begin
  APCKG.PROC;
end;

输出:

5: YOUR_SCHEMA.PACKAGE BODY APCKG.PROCEDURE PROC.PROCEDURE "INNER/proc"

输出格式:

Line number + ': ' + Owner + [ '.' + Type + ' ' + Name ]*

所以它只返回最后一个调用者及其层次结构.在位于包体内的函数内部的另一个过程.

如果您需要精确的解决方案并使用Oracle 12,请使用utl_call_stack.此解决方案适用于先前版本(在10.2上测试).它将返回上面的单行示例的第一次出现.

UPD:

我已将此解决方案升级为用于调用堆栈控制的完整包.
优点:

>在Oracle 9(separate package version),10和11上进行了测试.
>它确实解析了源(即词法分析,标记化等).
>纯PL / SQL.
>解析匿名阻止源代码(它们也可以包含内部过程).
>包含类似于utl_call_stack的方法.
>方法whoAmI和whoCalledMe.
>支持双引号.
>支持字符串的q表示法.
>跳过多行和单行注释.
>跳过没有定义的过程和函数声明.

Source code.

UPD 2:

>添加了对条件编译的支持.

UPD 3:

>为版本9,10 and 11实现了Oracle 12软件包utl_call_stack的backport.

(编辑:李大同)

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

    推荐文章
      热点阅读