sql >> Database >  >> RDS >> Oracle

Naam van de momenteel uitgevoerde procedure binnen het pakket

In 12c is de huidige naam van het subprogramma gewoon:

utl_call_stack.subprogram(1)(2);

Het huidige pakket is ook verkrijgbaar bij

utl_call_stack.subprogram(1)(1);

maar het is over het algemeen gemakkelijker om gewoon $$plsql_unit . te gebruiken . U kunt ook de gekwalificeerde naam krijgen (package.procedure ) als:

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

Echter , Ik kan geen enkele situatie bedenken waarin een procedure of functie (of objectmethode) een eigen naam zou willen hebben. Deze functionaliteit is vooral handig in een logprocedure, in welk geval de 'wie heeft mij gebeld?' code moet in de logger staan ​​en niet worden herhaald in elk ding dat het aanroept. Daarom raad ik u ten zeerste aan om 'wie ben ik?' . te vermijden logica in procedures. Plaats in plaats daarvan iets als dit in uw logger (vereist 12.1 of later):

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;

Helaas is het een beetje ingewikkelder in 11g omdat je dbms_utility.format_call_stack moet ontleden , en aangezien dit u alleen de pakketnaam en het regelnummer geeft (in een door linefeed gescheiden tekstreeks), moet u all_source opvragen om de naam van het subprogramma te vinden.

Ik kan wat 11g-code posten als je verduidelijkt waar het voor is. In mijn 11g-logger vond ik het handig om dbms_utility.format_error_backtrace vast te leggen evenals dbms_utility.format_call_stack afhankelijk van sqlcode enz. Er is dus een heleboel logica die specifiek is voor logboekregistratie, die u misschien niet nodig hebt als u om een ​​andere reden alleen de huidige procedurenaam wilt vastleggen.



  1. MySQL verbinden vanuit JSP

  2. `toon tabel aanmaken` equivalent in oracle sql

  3. SQLite hernoemt PRINTF() naar FORMAT()

  4. mysqldump doet een gedeeltelijke back-up - onvolledige tabeldump