存储过程异常处理

时间:2011-09-29 11:47:18

标签: oracle plsql oracle10g oracle11g

SQL>  DECLARE
2    TotalUpd   NUMBER(36) := 0;
3  BEGIN
4   dbms_output.put_line ('Job Start time............... : ' || to_char(SYSDATE, '             hh24:mi:ss'));
5   UPDATE Asset SET _status = 'PROGRESS' WHERE status is null;
6   TotalUpd := SQL%ROWCOUNT;
7   dbms_output.put_line('Total Records Updated. : ' || TotalUpd);
8    COMMIT;
9   EXCEPTION
10   WHEN NO_DATA_FOUND THEN
11  dbms_output.put_line ('No more data to update.');
12  WHEN OTHERS THEN
13  dbms_output.put_line ('Error while status as SUCCESS ');
14  END ;
15  /

上述程序的结果是     工作开始时间...............:04:41:41     记录总数已更新。 :0

但我的预期结果是“不再需要更新行”必须打印,因为我已经截断了表Asset.Please告诉我在哪里出错了。

4 个答案:

答案 0 :(得分:3)

就像没有数据时更新不会产生错误一样简单。

如果要控制代码流,则需要查看TotalUpd的值

 DECLARE 
 TotalUpd   NUMBER(36) := 0;
 BEGIN
    dbms_output.put_line ('Job Start time............... : ' 
        || TO_CHAR(SYSDATE, '             hh24:mi:ss'));
    UPDATE Asset SET _status = 'PROGRESS' WHERE status IS null;
    TotalUpd := SQL%ROWCOUNT; 
    IF TotalUpd = 0 THEN
        dbms_output.put_line ('No more data to update.');
    ELSE
        dbms_output.put_line('Total Records Updated. : '
            || TotalUpd);
    END IF; 
    COMMIT; 
 EXCEPTION 
 WHEN OTHERS THEN
    dbms_output.put_line ('Error while status as SUCCESS '); 
 END; 

答案 1 :(得分:3)

更新语句中不会抛出NO_DATA_FOUND错误。

如果select语句没有返回任何内容,则抛出select into语句。

另请参阅 select_item 下的Tahiti on select into:*如果SELECT INTO语句未返回任何行,则PL / SQL会引发预定义的异常NO_DATA_FOUND。*

如果更新语句没有更新任何内容,Oracle不认为它是异常,因此不会抛出异常。但是,如果select into语句无法填充变量,则会将其视为错误(因此在这种情况下会抛出NO_DATA_EXCEPTION(

答案 2 :(得分:1)

如果NO_DATA_FOUND没有返回任何行,则抛出

select into,而不是在更新语句后没有更新行。

我建议您在更新后移动处理此异常的逻辑:

IF (SQL%ROWCOUNT = 0) THEN  
  dbms_output.put_line ('No more data to update.');

答案 3 :(得分:0)

认为NO_DATA_FOUND异常仅由您未使用的SELECT语句引发。尝试测试SQL%COUNT并根据需要输出。