【问题标题】: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 中使用这个标志。
【问题讨论】:
标签:
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 的调用以排除包名称。