Multiple functions calling a same function. I need to create a flag. Suppose I have 4 functions(f1,f2,f3 and f4) in a PLSQL package. F1 is being called by F2,F3 and F4. All I want a flag in order to track which function call the F1. For example . If f2 called f1 then flag=2,flag=3 when f3 called f1 and so on and this should be accessible in such way that I can this flag inside function F1.
CodePudding user response:
CREATE FUNCTION f1 (otherParam int,...,flag int) RETURNS int
AS BEGIN -- enter command here
return flag END;
CodePudding user response:
You don't need to pass any flag, as PL/SQL can tell you the call stack.
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 * 3;
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 f1 * 4;
end f4;
end demo;
Test:
declare
n number;
begin
n := demo.f3;
end;
/
DEMO.F1 called from DEMO.F3
You can adjust the calls to util_call_stack
to exclude the package name if you only want the function names.