Това е 2012 2017. Скриптовете са тромав и крехък махмурлук от последното хилядолетие. Oracle има фантастичен набор от функционалности, които можем да изпълним в PL/SQL, плюс има Java Stored Procedures и има график за стартиране на задачи. Освен да стартирате 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, идентификационни данни за сигурност и т.н.). Те могат да бъдат предоставени само от привилегировани потребители (т.е. DBA). Освен ако нашата база данни няма удивително слаба конфигурация за сигурност, няма начин да стартираме произволен шел скрипт от PL/SQL.
И накрая, не е ясно каква полза очаквате от изпълнение на SQL скрипт в PL/SQL. Не забравяйте, че PL/SQL работи на сървъра на базата данни, така че не може да вижда скриптове на клиентската машина . Това изглежда уместно в светлината на изискването за приемане на въвеждане от потребителя.
Може би най-простото решение е преконфигурирането на оригиналния скрипт. Разделете необходимото PL/SQL извикване в блок и след това просто извикайте наименования скрипт:
begin
proc(para1,para2);
end;
/
@prompt1.sql