Oracle
 sql >> база данни >  >> RDS >> Oracle

Име на текущо изпълняваща се процедура в рамките на пакета

В 12c името на текущата подпрограма е само:

utl_call_stack.subprogram(1)(2);

Текущият пакет може да бъде получен и от

utl_call_stack.subprogram(1)(1);

но обикновено е по-лесно просто да използвате $$plsql_unit . Можете също така да получите квалифицираното име (package.procedure ) като:

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

Въпреки това , не мога да се сетя за ситуация, в която процедура или функция (или обектен метод) биха искали собствено име. Тази функционалност е полезна най-вече при процедура за регистриране, в който случай „кой ми се обади?“ кодът трябва да бъде в регистратора, а не да се повтаря във всяко едно нещо, което го извиква. Ето защо силно бих препоръчал да избягвате всяко „кой съм аз?“ логика в процедурите. Вместо това, поставете нещо подобно във вашия регистратор (изисква 12.1 или по-нова версия):

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;

За съжаление в 11g е малко по-сложно, тъй като трябва да анализирате dbms_utility.format_call_stack и тъй като това ви дава само името на пакета и номера на реда (в текстов низ, разделен с нов ред), тогава трябва да направите заявка all_source за да намерите името на подпрограмата.

Мога да публикувам някакъв 11g код, ако изясните за какво е. В моя 11g регистратор намерих за полезно да заснема dbms_utility.format_error_backtrace както и dbms_utility.format_call_stack в зависимост от sqlcode и т.н., така че има куп логика, която е специфична за регистрирането, която може да не ви е необходима, ако просто искате да заснемете текущото име на процедура по някаква друга причина.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да деактивирате тригера в Oracle SQL Developer?

  2. Няма повече SPU

  3. Изчисляване на разликата между две времеви марки в Oracle в милисекунди

  4. Ред за изпълнение на ORACLE SQL ROWNUM

  5. тип данни за ограничения на оракул