Заден план
Ние използваме 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
за всички strong> клиенти, или функцията клиент е специфична?
По-долу е даден пример за 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
и дали това е или не зависи от клиента?