Можно ли вызвать SQL Developer PL / SQL-форматирование из хранимой процедуры - PullRequest
2 голосов
/ 23 мая 2019

В Oracle SQL Developer, когда я щелкаю правой кнопкой мыши объект типа «Функция», «Процедура» или «Пакет», у меня есть возможность в контекстном меню выбрать «Выполнить» или «Профиль». В диалоговом окне отображаются поля «Цель», «Параметры» и «Блок PL / SQL». «Блок PL / SQL» отображает пример фрагмента кода для запуска программы, написанной как анонимный блок, и он отформатирован.

Мой вопрос: как это построено, и могу ли я поставить вокруг него процедуру, чтобы я мог вызывать ее из базы данных?

Если возможно, мне понадобится список параметров (имя объекта, владелец, ??) для вызова исполняемого файла / jave / и т.д. Я бы тогда создал что-то вроде этого:

create procedure pretty_print_sample_code(...some parameter list needed by developer method..) is
begin
    ..do some checks
    ..invoke the developer code
    ..output result as clob or line by line the result
end pretty_print_sample_code;
/

Тогда от sqlplus или разработчика я мог запустить программу, чтобы получить мой результат. Это может быть полезно для новой документации по функциональности (включая фрагменты кода в технических спецификациях) или просто для того, чтобы получить «шаблон» в базе данных, чтобы я мог легко изменять значения параметров и выполнять.

Я в первую очередь разработчик Oracle (самоучка 6 лет) с минимальными рабочими знаниями Java или C # и т. П., Так что если это не может быть легко вызвано с помощью хранимой процедуры, то нет необходимости в ответе на запрос в мельчайшие детали. Заранее спасибо.

1 Ответ

1 голос
/ 23 мая 2019

Мы опрашиваем словарь данных, чтобы получить данные, которые нам нужны, чтобы нарисовать диалог, подобный этому:

enter image description here

Вы можете увидеть SQL, за которым мы работаемсцены, чтобы получить эти данные, затем мы просто динамически генерируем код, который вы видите в анонимном блоке.

Например, мы запускаем это, чтобы получить список аргументов для вашей процедуры пакета:

SELECT position,
       argument_name,
       data_level,
       data_type,
       in_out,
       CASE
              WHEN char_used = 'C' THEN
                     char_length
              ELSE
                     data_length
       END data_length,
       data_precision,
       data_scale,
       type_owner,
       type_name,
       type_subname,
       pls_type
  FROM sys.dba_arguments
 WHERE owner = :owner
   AND object_id          = :id
   AND object_name        = :name
   AND nvl(overload, '0') = :overload
 ORDER BY sequence

Когда вы нажимаете «ОК», мы запускаем это через наш Script Engine, который может обрабатывать практически все, что может SQLPlus ... и который включает в себя захват SERVEROUTPUT, например, содержимого буфера DBMS_OUTPUT.

Вы можете быстро увидеть SQLмы запускаем соединение JDBC с Oracle на панели журнала ... остальное - НАШ Java-код, и вы можете воспроизводить его любым способом.

...