发生错误时退出执行 PL/SQL

Posted

技术标签:

【中文标题】发生错误时退出执行 PL/SQL【英文标题】:Exit execution when error occurs 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;
/ 

【问题讨论】:

【参考方案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 语句在这两种产品中都是有效的语句,但上下文不同。

【讨论】:

以上是关于发生错误时退出执行 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQLPL/SQL过程

Oracle——PL/SQL

发生错误时退出执行 PL/SQL

oracle(sql)基础篇系列——PLSQL游标存储过程触发器

尝试安装项目依赖项时运行 npm i(退出代码 1)时发生错误

运行cordova build ios --release(退出代码1)时发生错误[关闭]