sql >> Databasteknik >  >> RDS >> Oracle

Exekverar för närvarande procedurnamn i paketet

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.



  1. Flera databas och transaktioner

  2. MySQL ODBC Problem:Datakällans namn hittades inte och ingen standarddrivrutin specificerad

  3. MySQL - Utlösare för att uppdatera kolumn i en annan tabell efter infogning där den uppfyller andra värden

  4. Hur man gör RAND() deterministisk i SQL Server