【问题标题】:How to conditionally exit SQL Plus from PL/SQL如何从 PL/SQL 有条件地退出 SQL Plus
【发布时间】: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 的以下行为:

  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 Plus 中的执行的唯一方法,但是我在实现第 2 号项目符号时遇到了麻烦作为

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

您能帮我完成第 2 条,或者建议一种完全不同的方法。

【问题讨论】:

    标签: plsql sqlplus


    【解决方案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,你说得对,我误解了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多