Как получить имя объекта вызывающего в оракуле - PullRequest
2 голосов
/ 09 апреля 2019

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

...