【问题标题】:Exit execution when error occurs PL/SQL发生错误时退出执行 PL/SQL
【发布时间】:2014-02-14 18:23:19
【问题描述】:

我想知道,发生错误时如何退出执行。在 Microsoft SQL Server 中有一个 RETURN 子句,它可以完成这项工作。但我想知道 Oracle 中的类似功能。我正在使用 Oracle Sql Developer。这是我正在使用的脚本:

第一个块由于唯一键冲突而引发错误,即使它引发错误,执行也会转到下一个块并执行插入语句。我想在第一个代码块本身结束执行或退出。 请帮我写代码。

第一个匿名 PL/SQL 块:

set serveroutput on;

BEGIN 
  insert into test values(1);
  insert into test values(1);
  COMMIT;  

  dbms_output.put_line('PRINT SOMETHING 1'); 

EXCEPTION
   WHEN OTHERS THEN
     if sqlcode <> 0
     then
        dbms_output.put_line(SQLCODE || '  ' || SQLERRM);
        RAISE; 
     end if;
     return;
END;
/ 

第二个匿名 PL/SQL 块:

set serveroutput on;

BEGIN 
  insert into test values(6);
  COMMIT;  

  dbms_output.put_line('PRINT SOMETHING'); 

EXCEPTION
   WHEN OTHERS THEN
     if sqlcode <> 0
     then
        dbms_output.put_line(SQLCODE || '  ' || SQLERRM);
        RAISE; 
     end if;
     return;
 END;
/ 

【问题讨论】:

    标签: oracle execution


    【解决方案1】:

    如果您创建一个存储过程,您将拥有更多控制权,并且可以随时使用 return 语句退出。

    所以创建一个存储过程:

    create or replace procedure myProc as
    begin
       dbms_ouput.put_line('i am here');
       return;
       dbms_ouput.put_line('and not here');
    end;
    

    然后在sqlplus或developer中:

    exec myProc();
    

    【讨论】:

      【解决方案2】:

      您可以将块嵌套到单个“程序单元”中。 这样,第一个块中的异常将停止整个程序单元的执行,而不仅仅是限制在第一个块的范围内。

      set serveroutput on;
      
      BEGIN
        BEGIN 
          insert into test values(1);
          insert into test values(1);
          COMMIT;  
      
          dbms_output.put_line('PRINT SOMETHING 1'); 
      
        EXCEPTION
           WHEN OTHERS THEN
             if sqlcode <> 0
             then
                dbms_output.put_line(SQLCODE || '  ' || SQLERRM);
                RAISE; 
             end if;
             return;
        END;
        BEGIN 
          insert into test values(6);
          COMMIT;  
      
          dbms_output.put_line('PRINT SOMETHING'); 
      
        EXCEPTION
           WHEN OTHERS THEN
             if sqlcode <> 0
             then
                dbms_output.put_line(SQLCODE || '  ' || SQLERRM);
                RAISE; 
             end if;
             return;
        END;
      END;
      / 
      

      【讨论】:

        【解决方案3】:

        您应该可以使用“exit” - 请参阅此处的 Oracle 文档:http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12023.htm

        请注意,这将结束您的 SqlPlus 会话,但我不知道除了使用单个块或存储过程之外的其他方法。

        另一个有用的说法是:

        WHENEVER SQLERROR EXIT SQL.SQLCODE
        

        Oracle 文档:http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052.htm

        【讨论】:

          【解决方案4】:

          感谢您宝贵的 cmets。 JoshL,我尝试使用 EXIT,但最终出现错误。请更正我的代码(我是 PL/SQL 新手)。 “WHENEVER SQLERROR EXIT”很好用,但我的问题是我在 InstallShield 中使用了这些 sql 脚本,因此 InstallShield 安装程序无法识别这些语句并引发错误。

          set serveroutput on;
          
          BEGIN 
          
          insert into test values(1);
          insert into test values(1);
          
          COMMIT;  
          
            dbms_output.put_line('PRINT SOMETHING 1'); 
          
            EXCEPTION
              WHEN OTHERS THEN
              if sqlcode <> 0
              then
              dbms_output.put_line(SQLCODE || '  ' || SQLERRM);
              RAISE; 
              exit;
              end if;
          
          END;
          / 
          

          【讨论】:

            【解决方案5】:

            EXIT 命令仅用于 PL/SQL 的循环中。 EXIT 命令在该点离开循环。如果在 PL/SQL 的循环外使用 EXIT 命令,编译器会抛出错误。

            SQLPlus 中的 EXIT 命令退出 SQLPlus 会话。

            这很令人困惑,因为它们是两种不同的 Oracle 产品。 SQL*Plus 可以运行 PL/SQL,EXIT 语句在这两种产品中都是有效的语句,但上下文不同。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-10-05
              • 2011-12-03
              • 1970-01-01
              • 1970-01-01
              • 2011-02-17
              • 1970-01-01
              • 1970-01-01
              • 2023-03-16
              相关资源
              最近更新 更多