繁体   English   中英

存储过程异常处理

[英]Stored procedure exception handling

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缩短了。请告诉我我在哪里出错了。

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

如果要控制代码流,则需要查看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; 

更新语句中不会引发NO_DATA_FOUND错误。

如果select语句不返回任何内容,则会将其抛出到select into语句中。

另请参见塔希提岛 select_item下的select into :*如果SELECT INTO语句不返回任何行,则PL / SQL会引发预定义的异常NO_DATA_FOUND。

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

如果select into不返回任何行,则不是NO_DATA_FOUND ,如果在update语句之后没有行被更新,则抛出NO_DATA_FOUND

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM