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告诉我在哪里出错了。
答案 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并根据需要输出。