Наследуют ли сценарии 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 для all клиенты, или функция специфична для клиента?

Ниже приведен пример файла 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

Нам, по сути, нужно знать, наследуют ли переменную SET DEFINE OFF переменную 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
Правильный. Он будет поддерживать эту настройку до конца сеанса или до тех пор, пока она не будет изменена обратно на ON. Лучше всего исправить комментарии, вызывающие ошибки. - 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