111 подписчиков

Спецификация пакета по DBlink'у

Как показать на Oracle APEX спецификацию пакета на удаленном сервере Oracle?

Есть сервер Oracle APEX, с которого осуществляется публикация. Есть удаленный "боевой" сервер Oracle, на одну из схем которого установлен DBlink от сервера APEX. В другой схеме "боевого" сервера есть пакет, спецификацию которого нужно опубликовать в Web средствами Oracle APEX первого сервера. Как быть?

Казалось бы, очень просто:

  1. Делаем в схеме-владельце пакета на боевом сервере
    select ... from user_source where type = 'PACKAGE' and name = ...;
  2. Делаем с этого select'a представление;
  3. Даем grant select на это представление схеме боевого сервера, на которую проброшен DBlink с сервера публикации
    - и
    vu a la!

Но не вдруг. user_source - представление системное и права доверия на него по умолчанию не даны. Не получится дать читать представление на основе этого представления другой схеме.

Хорошо, тогда сделаем конвейерную функцию, определив предварительно векторный и табличный типы:

create type t_row as record (line number, text varchar2(4000))
;
create type t_tab as table of t_row
;
create function my_pkg_funct return t_tab pipelined
as
begin
for c in (select ... from user_source where ...) loop
pipe row (c);
end loop;
return;
end;

- и дадим на нее права исполнения схеме, на которую проброшен DBlink. Опять беда: результаты конвейерных функций по DBlink'ам не передаются.

Ладно. Создадим представление:

create view my_pkg_vi as
select * from table(my_pkg_funct)
;

- и дадим на него права чтения схеме, на которую проброшен DBlink.

А на сервере Oracle APEX создадим классический отчет с запросом вида (подавим пустые строки):

select line, text
from main_schema.my_pkg_vi@my_db_link
where replace(text, chr(10), '') is not null
order by line
;

Вот теперь все заработало!