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

时间:2014-02-14 18:23:20

标签: oracle execution

我想知道,如何在发生错误时退出执行。在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;
/ 

5 个答案:

答案 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语句在两个产品中都是有效的语句,但具有不同的上下文。