В 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
и т.н., така че има куп логика, която е специфична за регистрирането, която може да не ви е необходима, ако просто искате да заснемете текущото име на процедура по някаква друга причина.