我想知道,如何在发生错误时退出执行。在Microsoft SQL Server中,有一个RETURN
子句,可以完成这项工作。但我想知道Oracle中的类似功能。我正在使用Oracle Sql Developer。这是我正在使用的脚本:
由于唯一键冲突导致第一个块抛出错误,即使它抛出错误,执行转到下一个块并执行insert语句。我想在第一个代码块本身结束执行或退出。 请帮我写代码。
第一个匿名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;
/
答案 0 :(得分:3)
如果您创建了一个存储过程,则可以获得更多控制权,并且可以随时使用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或开发者中:
exec myProc();
答案 1 :(得分: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;
/
答案 2 :(得分:1)
您应该能够使用“退出” - 请参阅此处的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
答案 3 :(得分:0)
感谢您的宝贵意见。 JoshL,我尝试使用EXIT,但我最终得到了错误。请更正我的代码(我是PL / SQL的新手)。 “WHEREVER 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;
/
答案 4 :(得分:0)
EXIT命令仅用于PL / SQL中的循环。 EXIT命令在该点离开循环。如果在PL / SQL中的循环外使用EXIT命令,则编译器会抛出错误。
SQL Plus中的EXIT命令退出SQL Plus会话。
这很令人困惑,因为它们是两种不同的Oracle产品。 SQL * Plus可以运行PL / SQL,EXIT语句在两个产品中都是有效的语句,但具有不同的上下文。