其他 SQL 脚本执行的 SQL 脚本是否会继承所有客户端在父级中设置的系统变量?

Do SQL scripts executed by other SQL scripts inherit the system variables set in the parent for all clients?

背景

我们正在使用 Oracle 12c。

我有一个名为 load_all.sql 的 PL/SQL 文件,它执行另一个 PL/SQL 文件 称为financial_aid.sql。开发人员正在 financial_aid.sql 中的注释中添加 & 字符。当他们在 PL/SQL Developer 中编译 financial_aid.sql 时,& 符号不会注册为 Oracle SQL 替换变量。但是,当它通过 ant 脚本执行时,它们会注册为 SQL 替换变量。结果,我们获取包创建包体失败,并显示如下错误

SP2-0546: User requested Interrupt or EOF detected.

建议的解决方案

为了解决这个问题,我们想在 SQL 文件中添加一个系统变量 SET DEFINE OFF。这可以防止在自动构建过程中发生 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 执行 parent 继承 all 客户端的 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 以及 load_all.sql 执行的所有其他 sql 文件是否会继承 SET DEFINE OFF 变量,这是否取决于客户端?

是的,父脚本调用的文件将继承SET DEFINE OFF