如何从PL / SQL有条件地退出SQL Plus

时间:2017-12-28 12:41:58

标签: plsql sqlplus

我有一个主要的SQL脚本(比如main.sql),其中包含其他文件:

-- Contents of main.sql 
@@init.sql
@@body.sql

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

  1. 如果cond1为真,则init.sql应终止main.sql的执行,并显示错误,导致body.sql无法运行
  2. 如果cond2为真,则init.sql应成功终止main.sql的执行,以使body.sql无法运行
  3. 如果cond3为真,则init.sql应成功退出,body.sql的执行应该开始
  4. 我正在尝试使用RAISE_APPLICATION_ERRORWHENEVER SQLERROR EXIT一起使用此行为,因为我已经了解到这是在SQL Plus中完全终止执行的唯一方法,但是我遇到了麻烦第2号子弹

    • 我无法使用0代码使init.sql退出到操作系统。我尝试设置绑定变量并使用WHENEVER SQLERROR EXIT :retcode:retcode在调用EXIT时显示为空,即使dbms_output.put_line在此之前输出正确的此变量值致电RAISE_APPLICATION_ERROR
    • 这种情况很正常,我宁愿没有出现Oracle异常

    你能帮助我完成2号子弹,或者总体上建议采用完全不同的方法。

2 个答案:

答案 0 :(得分:0)

您可以通过有条件地调用包含您喜欢的返回代码的一个或另一个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;
/

不是很令人满意,但跳跃有助于:)

答案 1 :(得分:0)

这应该有效:

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;
/