I 12c er det aktuelle underprogramnavn kun:
utl_call_stack.subprogram(1)(2);
Den aktuelle pakke kan også hentes fra
utl_call_stack.subprogram(1)(1);
men det er generelt nemmere bare at bruge $$plsql_unit
. Du kan også få det kvalificerede navn (package.procedure
) som:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Men , Jeg kan ikke komme i tanke om nogen situation, hvor en procedure eller funktion (eller objektmetode) ville have sit eget navn. Denne funktionalitet er mest nyttig i en logningsprocedure, i hvilket tilfælde 'hvem ringede til mig?' kode skal være i loggeren, og ikke gentages i hver eneste ting, der kalder den. Derfor vil jeg kraftigt anbefale at undgå 'hvem er jeg?' logik i procedurer. Indsæt i stedet noget som dette i din logger (kræver 12.1 eller nyere):
create or replace procedure logdemo
as
k_calling_package constant varchar2(128) := utl_call_stack.subprogram(2)(1);
k_calling_subprog constant varchar2(128) := utl_call_stack.subprogram(2)(2);
begin
dbms_output.put_line
( $$plsql_unit ||
' called from package '||k_calling_package||', subprogram '||k_calling_subprog );
end logdemo;
Desværre er det lidt mere kompliceret i 11g, da du skal parse dbms_utility.format_call_stack
, og da dette kun giver dig pakkenavnet og linjenummeret (i en linjefeed-separeret tekststreng), skal du forespørge all_source
for at finde underprogramnavnet.
Jeg kan sende nogle 11g kode, hvis du præciserer, hvad det er til. I min 11g logger fandt jeg det nyttigt at fange dbms_utility.format_error_backtrace
samt dbms_utility.format_call_stack
afhængig af sqlcode
osv., så der er en masse logik, der er specifik for logning, som du måske ikke har brug for, hvis du bare vil fange det nuværende procedurenavn af en anden grund.