Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Name der derzeit ausgeführten Prozedur innerhalb des Pakets

In 12c lautet der Name des aktuellen Unterprogramms einfach:

utl_call_stack.subprogram(1)(2);

Das aktuelle Paket kann auch von

bezogen werden
utl_call_stack.subprogram(1)(1);

aber im Allgemeinen ist es einfacher, einfach $$plsql_unit zu verwenden . Sie können auch den qualifizierten Namen (package.procedure ) als:

utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));

Allerdings , ich kann mir keine Situation vorstellen, in der eine Prozedur oder Funktion (oder Objektmethode) einen eigenen Namen haben möchte. Diese Funktionalität ist vor allem in Protokollierungsvorgängen nützlich, in diesem Fall 'Wer hat mich angerufen?' Code sollte im Logger sein und nicht in jedem einzelnen Ding wiederholt werden, das ihn aufruft. Daher würde ich dringend empfehlen, Wer bin ich? zu vermeiden Logik in Verfahren. Fügen Sie stattdessen so etwas wie das Folgende in Ihren Logger ein (erfordert 12.1 oder höher):

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;

Leider ist es in 11g etwas komplizierter, da Sie dbms_utility.format_call_stack parsen müssen , und da Ihnen dies nur den Paketnamen und die Zeilennummer (in einer durch Zeilenumbrüche getrennten Textzeichenfolge) liefert, müssen Sie dann all_source abfragen um den Namen des Unterprogramms zu finden.

Ich kann einen 11g-Code posten, wenn Sie klarstellen, wofür er ist. In meinem 11g-Logger fand ich es nützlich, dbms_utility.format_error_backtrace zu erfassen sowie dbms_utility.format_call_stack abhängig von sqlcode usw., daher gibt es eine Reihe von Logiken, die spezifisch für die Protokollierung sind, die Sie möglicherweise nicht benötigen, wenn Sie nur den aktuellen Prozedurnamen aus einem anderen Grund erfassen möchten.