首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有条件地退出PL/SQL中的SQL Plus

如何有条件地退出PL/SQL中的SQL Plus
EN

Stack Overflow用户
提问于 2017-12-28 12:41:57
回答 2查看 2.9K关注 0票数 2

我有一个主SQL脚本(比如main.sql),它包括如下所示的其他文件:

代码语言:javascript
运行
复制
-- Contents of main.sql 
@@init.sql
@@body.sql

这个模板是固定的,我无法控制它。我只能将任何代码放入包含的文件中。Init.sql由PL/SQL代码组成。Main.sql使用SQL运行。现在,我想要init.sql的以下行为

  1. 如果cond1是真,那么init.sql应该用一个错误来终止main.sql的执行,这样body.sql就不会运行
  2. 如果cond2是真的,那么init.sql应该成功地终止main.sql的执行,这样body.sql也不会运行
  3. 如果cond3是真的,那么init.sql应该成功退出,body.sql的执行应该开始

我正在尝试使用RAISE_APPLICATION_ERRORWHENEVER SQLERROR EXIT来实现这种行为,因为我已经了解到这是在SQL中完全终止执行的唯一方法,但我在实现第2号项目时遇到了困难

  • 我无法使用0代码使init.sql退出到操作系统。我尝试设置一个绑定变量并使用WHENEVER SQLERROR EXIT :retcode,但是在调用EXIT时,:retcode似乎是空的,即使dbms_output.put_line在调用RAISE_APPLICATION_ERROR之前输出了该变量的正确值
  • 这种情况很正常,我宁愿不出现Oracle异常

你能帮我完成第二题吗?或者建议一种完全不同的方法。

EN

回答 2

Stack Overflow用户

发布于 2017-12-28 14:57:46

您可以通过有条件地调用包含您喜欢的返回代码的一个或另一个sql文件来处理不同的返回代码:

cond1.sql

代码语言:javascript
运行
复制
WHENEVER SQLERROR EXIT 1

cond2.sql

代码语言:javascript
运行
复制
WHENEVER SQLERROR EXIT 0

下面是您的init.sql的启动方式:

代码语言:javascript
运行
复制
--> 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;
/

不太满意,但跳起来会有帮助:)

票数 1
EN

Stack Overflow用户

发布于 2017-12-28 16:08:32

这应该是可行的:

init.sql:

代码语言:javascript
运行
复制
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;
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48007733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档