sql >> Databáze >  >> RDS >> Oracle

Název aktuálně prováděné procedury v rámci balíčku

V 12c je aktuální název podprogramu pouze:

utl_call_stack.subprogram(1)(2);

Aktuální balíček lze také získat z

utl_call_stack.subprogram(1)(1);

ale obecně je jednodušší použít pouze $$plsql_unit . Můžete také získat kvalifikovaný název (package.procedure ) jako:

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

Nicméně , nenapadá mě žádná situace, kdy by procedura nebo funkce (nebo metoda objektu) chtěla svůj vlastní název. Tato funkce je většinou užitečná v proceduře protokolování, v takovém případě se zobrazí 'kdo mi volal?' kód by měl být v loggeru a neměl by se opakovat v každé jednotlivé věci, která jej volá. Proto důrazně doporučuji vyhnout se jakémukoli kdo jsem? logika v postupech. Místo toho vložte do svého loggeru něco takového (vyžaduje 12.1 nebo novější):

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;

Bohužel je to v 11g trochu složitější, protože musíte analyzovat dbms_utility.format_call_stack , a protože tím získáte pouze název balíčku a číslo řádku (v textovém řetězci odděleném odřádkováním), musíte se zeptat all_source najít název podprogramu.

Mohu poslat nějaký 11g kód, pokud upřesníte, k čemu to je. V mém 11g loggeru jsem zjistil, že je užitečné zachytit dbms_utility.format_error_backtrace a také dbms_utility.format_call_stack v závislosti na sqlcode atd., takže existuje spousta logiky, která je specifická pro protokolování, kterou možná nebudete potřebovat, pokud chcete pouze zachytit název aktuální procedury z nějakého jiného důvodu.



  1. Odstraňování problémů:Příliš mnoho přesměrování

  2. Export databáze MySQL pomocí PHP

  3. SQL Server 2008 - Split

  4. Počet sloupců mysql.user je nesprávný. Očekáváno 42, nalezeno 44. Tabulka je pravděpodobně poškozená