SQL скриптовете, изпълнявани от други SQL скриптове, наследяват ли системните променливи, зададени в родителския файл за всички клиенти?

Заден план

Ние използваме Oracle 12c.

Имам PL/SQL файл, наречен load_all.sql, който изпълнява друг PL/SQL файл, нареченfinancial_aid.sql. Разработчиците добавят амперсанд към коментарите в financial_aid.sql. Когато компилират financial_aid.sql в PL/SQL Developer, амперсандите не се регистрират като заместващи променливи на Oracle SQL. Въпреки това, когато се изпълнява чрез ant скрипт, те се регистрират като SQL заместващи променливи. В резултат на това получаваме, че пакетът не успява да създаде тялото на пакета и показва следната грешка

SP2-0546: User requested Interrupt or EOF detected.

Предложено решение

За да разрешим това, искаме да добавим системна променлива SET DEFINE OFF към SQL файловете. Това предотвратява възникването на грешката SP2-0546 по време на нашия автоматизиран процес на изграждане.

Нашият процес на изграждане обаче е сложен и използва много различни клиенти (ANT, SQLPlus, Maven и т.н.), за да изпълнява тези PL/SQL файлове. Освен това load_all.sql динамично изпълнява стотици други SQL файлове и ние не искаме да SET DEFINE OFF във всички тези файлове.

Въпрос

Знаем, че SET DEFINE OFF е системна променлива от страна на клиента. Ако добавим SET DEFINE OFF към load_all.sql, всеки файл, изпълняван от родителския load_all.sql, ще наследи параметъра DEFINE OFF за всички клиенти, или функцията клиент е специфична?

По-долу е даден пример за load_all.sql с променливата SET DEFINE OFF за пояснение

Код

SET DEFINE OFF
PROMPT 'loading @financial_aid.sql'
@financial_aid.sql
PROMPT 'loading @other_file.sql'
@other_file.sql
PROMPT 'loading @other_file2.sql'
@other_file2.sql

По същество искаме да знаем дали financial_aid.sql, other_file.sql и всички други sql файлове, изпълнявани от load_all.sql, ще наследят променливата SET DEFINE OFF и дали това е или не зависи от клиента?


person Chris Maggiulli    schedule 02.10.2020    source източник
comment
Между другото, добра идея е да дадете на файловете с изходен код на PL/SQL различно разширение от SQL скриптовете, особено когато работите с PL/SQL Developer, тъй като той използва разширението, за да определи в кой тип прозорец да го отворите.   -  person William Robertson    schedule 02.10.2020


Отговори (1)


Да, файловете, извикани от родителския скрипт, ще наследят SET DEFINE OFF

person EJ Egyed    schedule 02.10.2020
comment
И не зависи от клиента? Трябва ли да очакваме същата функционалност във всички клиенти (sqlplus, ant, sql разработчик, pl/sql разработчик и т.н.)? - person Chris Maggiulli; 02.10.2020
comment
Правилно. Той ще поддържа тази настройка до края на сесията или освен ако не бъде променен обратно на ВКЛ. Най-добре е да поправите коментарите, които причиняват грешки. - person EJ Egyed; 02.10.2020
comment
Дори във вашия примерен код, ако SET DEFINE OFF е указано в financial_aid.sql или other_file.sql, настройката пак ще бъде зададена, когато other_file2.sql работи. - person EJ Egyed; 02.10.2020