如何从 PL/SQL 有条件地退出 SQL Plus
Posted
技术标签:
【中文标题】如何从 PL/SQL 有条件地退出 SQL Plus【英文标题】:How to conditionally exit SQL Plus from PL/SQL 【发布时间】:2017-12-28 12:41:57 【问题描述】:我有一个主 SQL 脚本(比如 main.sql
),其中包括其他文件,如下所示:
-- Contents of main.sql
@@init.sql
@@body.sql
这个模板是固定的,我无法控制它。我只能将任何代码放入包含的文件中。 Init.sql
由 PL/SQL 代码组成。 Main.sql
使用 SQL Plus 运行。现在我想要init.sql
的以下行为:
-
如果
cond1
为真,则init.sql
应终止main.sql
的执行,并出现错误,导致body.sql
无法运行
如果cond2
为真,那么init.sql
应该成功终止main.sql
的执行,这样body.sql
也不会运行
如果cond3
为真,那么init.sql
应该成功退出并且body.sql
应该开始执行
我正在尝试使用 RAISE_APPLICATION_ERROR
和 WHENEVER SQLERROR EXIT
来获得这种行为,因为我了解到这是完全终止 SQL Plus 中的执行的唯一方法,但是我在实现第 2 号项目符号时遇到了麻烦作为
init.sql
退出到带有0 代码的操作系统。我试图设置一个绑定变量并使用WHENEVER SQLERROR EXIT :retcode
,但当EXIT
被调用时:retcode
似乎为空,即使dbms_output.put_line
在调用RAISE_APPLICATION_ERROR
之前立即输出此变量的正确值
这种情况是正常的,我宁愿不要出现 Oracle 异常
您能帮我完成第 2 条,或者建议一种完全不同的方法。
【问题讨论】:
【参考方案1】:您可以通过有条件地调用包含您喜欢的返回码的一个或另一个 sql 文件来处理不同的返回码:
cond1.sql:
WHENEVER SQLERROR EXIT 1
cond2.sql:
WHENEVER SQLERROR EXIT 0
那么这就是你的init.sql
的开始方式:
--> Variable for init condition
col the_cond New_value the_cond noprint
--> select into condition variable
Select decode(smthg, 1, 'cond1', 2, 'cond2') the_cond
From table Where (whatever);
-- call to the host for the file:
@/path/to/the_file/&the_cond
begin
-- then here an exception will cause exit, with return code set right before in file the_cond
end;
/
不是很满意,但跳起来有帮助:)
【讨论】:
【参考方案2】:这应该可行:
init.sql:
WHENEVER SQLERROR EXIT 0
BEGIN
IF COND2 THEN
RAISE_APPLICATION_ERROR(-20001, 'Cant continue');
END IF;
END;
/
WHENEVER SQLERROR EXIT 1
BEGIN
IF COND1 THEN
RAISE_APPLICATION_ERROR(-20001, 'Cant continue');
END IF;
END;
/
【讨论】:
您确定此解决方案允许切换sqlplus
返回码吗?我的理解是 OP 想要:condition 1
=> exit + return code=1; condition 2
=> 退出 + 返回码=0。
@J. Chomel,你说得对,我误解了这个问题。以上是关于如何从 PL/SQL 有条件地退出 SQL Plus的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL - 如果不满足条件,则退出开始结束块