[英]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.