发生错误时退出执行 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的主要内容,如果未能解决你的问题,请参考以下文章
oracle(sql)基础篇系列——PLSQL游标存储过程触发器