В Oracle сложно правильно получить имя объекта вызывающего, когда он упакован в пакет.Вот моя попытка достичь этого:
CREATE OR REPLACE function GET_MY_NAME return varchar2 is
v_owner varchar2(50);
v_name varchar2(50);
v_lineno number ;
v_caller_t varchar2(50);
begin
-- let's determine the object
owa_util.who_called_me(
v_owner
, v_name
, v_lineno
, v_caller_t
);
dbms_output.put_line(v_caller_t || ' ' || v_owner || '.' || v_name || ' at ' || v_lineno);
with s as (
select s.*
, max(line - 1) over (partition by name order by line rows between 1 following and 1 following) to_line
, regexp_substr(s.text, '\w+', 1, 2) func_name
from all_source s
where s.type = v_caller_t
and s.owner = v_owner
and s.name = v_name
and regexp_like(s.text, 'procedure|function')
)
select max(nvl(s.func_name, v_name ))
, max(nvl(s.name , v_owner))
into v_name, v_owner
from s
where v_lineno between s.line and nvl(s.to_line, 9999999);
return v_owner || '.' || v_name;
end;
Идея состоит в том, чтобы определить линии внутри источника каждого внутреннего объекта и взять соответствующий объект.Это прекрасно работает для пакетов, но для функций и процедур не может определить, был ли он вызван из основного блока.Вот небольшая демонстрация:
create or replace function check_my_name return varchar2 is
function sub_check_my_name return varchar2 is
begin
return get_my_name;
end;
begin
dbms_output.put_line(sub_check_my_name);
return get_my_name;
end;
/
Вы можете видеть, что sub_check_my_name работает, но прямой вызов get_my_name также возвращает sub_check_my_name.Как я могу определить, происходит ли вызов внутри основного функционального блока?