其他 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.sqlload_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.sqlother_file.sql 中指定了SET DEFINE OFF,则在other_file2.sql 运行时仍会设置该设置。

以上是关于其他 SQL 脚本执行的 SQL 脚本是不是继承父级中为所有客户端设置的系统变量?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:是不是有完全停止脚本执行的指令?

dbaccess如何调用sql脚本

如何从 ksh 脚本执行 Derby DB 的 SQL 脚本

在shell脚本中执行mysql,调用sql文件,将sql文件执行结果存入新的日志文件中,但日志文件没有sql结果

如何执行一个mysql的sql脚本文件

如何在shell中调SQLPLUS 执行SQL语句