【问题标题】:Get name of nested procedure that called my procedure获取调用我的过程的嵌套过程的名称
【发布时间】:2026-02-04 06:30:01
【问题描述】:

我是 PL SQL 的新手,我想知道有没有办法(方法/函数/等)可以获得调用我的过程的嵌套过程的名称?

例如,我有 my_procedure,它被嵌套在 another_package 中的 another_procedure 调用。我想要一个在 my_procedure 中实现的函数/方法,它每次都告诉我哪个嵌套过程称为 my_procedure,在本例中为 my_procedure。

我正在使用 owa_util.who_call_me 来获取包和所有者名称。

【问题讨论】:

  • name out 参数来自owa_util.who_called_me 告诉您调用的包和过程名称;所以我不确定引用你在找什么?也许minimal reproducible example 会有所帮助。
  • 不,它只考虑最外层的对象,因为它是一个嵌套过程。因此,对于我的示例,我从调用它的位置获取所有者、包、包中的行和“包体”。
  • 好的,那么您使用的是旧版本; 18c shows both11g doesn't。您实际使用的是哪个版本 - 它可能会影响其他可用版本?
  • 我的版本是12.1
  • 这个答案包括如何获取调用过程:*.com/a/50541599/230471 不过我不确定你所说的嵌套过程是什么意思。

标签: sql oracle plsql toad plsql-package


【解决方案1】:

演示程序:

create or replace procedure demo
as
    k_this   constant varchar2(300) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
    k_caller constant varchar2(300) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(2));
begin
    dbms_output.put_line(k_this || ' called from ' || k_caller);
end demo;

调用它的包:

create or replace package testit
as
    procedure do_something;
end testit;
/

create or replace package body testit
as
    procedure do_something is
    begin
        demo;
    end do_something;
end testit;
/

测试:

begin
    testit.do_something;
end;
/

DEMO called from TESTIT.DO_SOMETHING

【讨论】: