【问题标题】:Multiple functions calling a same function. I need to create a flag多个函数调用同一个函数。我需要创建一个标志
【发布时间】:2022-01-20 15:59:36
【问题描述】:

多个函数调用同一个函数。我需要创建一个标志。 假设我在一个 PLSQL 包中有 4 个函数(f1、f2、f3 和 f4)。 F1 被 F2、F3 和 F4 调用。我只想要一个标志来跟踪哪个函数调用了 F1。 例如 。如果 f2 调用 f1 然后 flag=2,flag=3 当 f3 调用 f1 等等,这应该可以通过这样的方式访问,我可以在函数 F1 中使用这个标志。

【问题讨论】:

  • 添加flag作为输入参数。

标签: sql oracle plsql plsql-package


【解决方案1】:

CREATE FUNCTION f1 (otherParam int,...,flag int) 返回整数

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

返回标志 结束;

【讨论】:

    【解决方案2】:

    您不需要传递任何标志,因为 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 的调用以排除包名称。

    【讨论】:

      猜你喜欢
      • 2018-08-30
      • 2012-06-25
      • 2011-11-03
      • 2012-04-25
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多