I 12c är det aktuella underprogramnamnet bara:
utl_call_stack.subprogram(1)(2);
Det aktuella paketet kan också hämtas från
utl_call_stack.subprogram(1)(1);
men det är generellt sett lättare att bara använda $$plsql_unit
. Du kan också få det kvalificerade namnet (package.procedure
) som:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
Men , Jag kan inte komma på någon situation där en procedur eller funktion (eller objektmetod) skulle vilja ha ett eget namn. Den här funktionen är mest användbar i en loggningsprocedur, i vilket fall 'vem ringde mig?' koden ska finnas i loggern och inte upprepas i varenda sak som anropar den. Därför rekommenderar jag starkt att du undviker någon 'vem är jag?' logik i procedurer. Lägg istället in något liknande i din logger (kräver 12.1 eller senare):
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;
Tyvärr är det lite mer komplicerat i 11g eftersom du måste analysera dbms_utility.format_call_stack
, och eftersom detta bara ger dig paketnamnet och radnumret (i en radflödesavgränsad textsträng), måste du fråga all_source
för att hitta underprogramnamnet.
Jag kan lägga upp en 11g-kod om du förtydligar vad den är till för. I min 11g-logger tyckte jag att det var användbart att fånga dbms_utility.format_error_backtrace
samt dbms_utility.format_call_stack
beroende på sqlcode
etc, så det finns en massa logik som är specifik för loggning, som du kanske inte behöver om du bara vill fånga det aktuella procedurnamnet av någon annan anledning.