其他 SQL 脚本执行的 SQL 脚本是不是继承父级中为所有客户端设置的系统变量?
Posted
技术标签:
【中文标题】其他 SQL 脚本执行的 SQL 脚本是不是继承父级中为所有客户端设置的系统变量?【英文标题】:Do SQL scripts executed by other SQL scripts inherit the system variables set in the parent for all clients?其他 SQL 脚本执行的 SQL 脚本是否继承父级中为所有客户端设置的系统变量? 【发布时间】:2020-10-02 17:35:01 【问题描述】:背景
我们使用的是 Oracle 12c。
我有一个名为 load_all.sql 的 PL/SQL 文件,它执行另一个 PL/SQL 文件 称为financial_aid.sql。开发人员正在向 financial_aid.sql 中的 cmets 添加 & 字符。当他们在 PL/SQL Developer 中编译 financial_aid.sql 时,与号不会注册为 Oracle SQL 替换变量。但是,当它通过 ant 脚本执行时,它们确实注册为 SQL 替换变量。结果我们得到package failed to create package body 并显示如下错误
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 父执行的每个 文件继承 的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
变量,以及这是否依赖于客户端?
【问题讨论】:
顺便说一下,给 PL/SQL 源代码文件提供与 SQL 脚本不同的扩展名是个好主意,尤其是在使用 PL/SQL Developer 时,因为它使用扩展名来确定窗口的类型打开它。 【参考方案1】:是的,父脚本调用的文件会继承SET DEFINE OFF
【讨论】:
它不依赖于客户端?我们应该期望所有客户端(sqlplus、ant、sql developer、pl/sql developer等)都具有相同的功能? 正确。它将在会话的其余部分保持该设置,或者除非将其更改回 ON。最好的办法是修复导致错误的 cmets。 即使在您的示例代码中,如果在financial_aid.sql
或other_file.sql
中指定了SET DEFINE OFF
,则在other_file2.sql
运行时仍会设置该设置。以上是关于其他 SQL 脚本执行的 SQL 脚本是不是继承父级中为所有客户端设置的系统变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ksh 脚本执行 Derby DB 的 SQL 脚本