sql >> Database teknologi >  >> RDS >> Oracle

Udfører i øjeblikket procedurenavn i pakken

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.



  1. MySQL datoformat - hvad du behøver at vide

  2. Sådan kalder du en procedure hver gang mysql-forbindelse oprettes på amazon RDS

  3. Tabel Dato kolonne sammenligning med en genereret datoliste - MYSQL

  4. Fjernelse af en mængde fra flere rækker i en database