多个函数调用同一个函数。我需要创建一个标志

Multiple functions calling a same function. I need to create a flag

多个函数调用同一个函数。我需要创建一个标志。 假设我在 PLSQL 包中有 4 个函数(f1、f2、f3 和 f4)。 F1 被 F2、F3 和 F4 调用。我只想要一个标志来跟踪哪个函数调用 F1。 例如 。如果 f2 调用 f1,则 flag=2,flag=3,当 f3 调用 f1 时,依此类推,这应该可以访问,以便我可以在函数 F1 中使用此标志。

创建函数 f1 (otherParam int,...,flag int) RETURNS 整数

作为 开始 -- 在这里输入命令

return 标志 结束;

您不需要传递任何标志,因为 PL/SQL 可以告诉您调用堆栈。

create or replace package demo
as
    function f1 return number;
    function f2 return number;
    function f3 return number;
    function f4 return number;
end demo;
create or replace package body demo
as

    function f1 return number
    is
        this_unit varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
        caller    varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(2));
    begin
        dbms_output.put_line(this_unit || ' called from ' || caller);
        return 1;
    end f1;

    function f2 return number
    is
        this_unit varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
        caller    varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(2));
    begin
        dbms_output.put_line(this_unit || ' called from ' || caller);
        return f1 * 2;
    end f2;

    function f3 return number
    is
        this_unit varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
        caller    varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(2));
    begin
        dbms_output.put_line(this_unit || ' called from ' || caller);
        return f1 + f2;
    end f3;

    function f4 return number
    is
        this_unit varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
        caller    varchar2(257) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(2));
    begin
        dbms_output.put_line(this_unit || ' called from ' || caller);
        return f2 * 2;
    end f4;

end demo;

测试:

declare
    n number;
begin
    n := demo.f3;
end;
/

DEMO.F3 called from __anonymous_block
DEMO.F1 called from DEMO.F3
DEMO.F2 called from DEMO.F3
DEMO.F1 called from DEMO.F2

如果您只需要函数名称,您可以调整对 util_call_stack 的调用以排除包名称。