多个函数调用同一个函数。我需要创建一个标志
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
的调用以排除包名称。
多个函数调用同一个函数。我需要创建一个标志。 假设我在 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
的调用以排除包名称。