Это 2012 2017. Сценарии - это неуклюжее и хрупкое похмелье прошлого тысячелетия.Oracle обладает фантастическим набором функций, которые мы можем выполнять в PL / SQL, плюс есть хранимые процедуры Java и планирование запуска заданий.Помимо запуска DDL для создания или изменения схем, едва ли есть необходимость в сценариях в среде баз данных Oracle;даже сценарии DDL должны запускаться с внешнего клиента, вероятно, инструмента сборки, такого как TeamCity.
В частности, я бы рассматривал попытку запуска сценария SQL из программы PL / SQL как архитектурный сбой.Что вы делаете со сценарием, который вы не можете сделать с хранимой процедурой?
Что касается передачи ввода в хранимую процедуру, то для этого и нужны параметры.PL / SQL не интерактивен, нам нужен клиент для ввода значений.В зависимости от сценария это может быть сделано асинхронно (значения в файле или таблице) или синхронно (вызов хранимой процедуры из SQL * Plus, SQL Developer или специального интерфейса).
Сказаввсе это, в реальном мире мы работаем с грязными архитектурами с взаимозависимостью между базой данных и внешней ОС.Итак, что мы можем сделать?
- Мы можем написать хранимую процедуру Java для выполнения команд оболочки.Это почтенное решение, появившееся со времен Oracle 8i. Узнайте больше .
- В 10g Oracle замените DBMS_JOB на DBMS_SCHEDULER.Одним из усовершенствований этого инструмента является его способность запускать внешние задания, например сценарии оболочки. Узнать больше .
- Поскольку внешние таблицы Oracle 11g R1 поддерживают сценарии препроцессора, которые перед выполнением запроса выполняют команды оболочки. Узнать больше .
Обратите внимание, что все эти опции требуют повышенного доступа (предоставление объектов DIRECTORY, учетных данных безопасности и т. Д.).Они могут быть предоставлены только привилегированным пользователям (например, администраторам баз данных).Если наша база данных не имеет удивительно слабой конфигурации безопасности, мы не сможем запустить произвольный сценарий оболочки из PL / SQL.
Наконец, неясно, какую выгоду вы ожидаете от запуска сценария SQL в PL / SQL.Помните, что PL / SQL работает на сервере базы данных, поэтому не может видеть скрипты на клиентском компьютере .Это представляется уместным в свете требования принять пользовательский ввод.
Возможно, самое простое решение - это перенастройка исходного сценария.Выделите необходимый PL / SQL-вызов в блок, а затем просто вызовите именованный скрипт:
begin
proc(para1,para2);
end;
/
@prompt1.sql