我有以下代码,当我使用不存在的id的匿名块时,过程仍然会生成成功输出消息,而不是错误消息。为什么?
CREATE OR REPLACE PROCEDURE UPD_CUST_STATUS_IN_DB (pcustid number, pstatus varchar2) IS
BEGIN
UPDATE CUSTOMER
SET status = pstatus
WHERE custid = pcustid;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('ORA-20122:ERROR:CUSTOMER ID NOT FOUND');
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.PUT_LINE('ORA-20134:ERROR:INVALID STATUS VALUE');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
dbms_output.put_line(SQLCODE);
END;
/
CREATE OR REPLACE PROCEDURE UPD_CUST_STATUS_VIASQLDEV (pcustid number, pstatus varchar2) IS
BEGIN
dbms_output.put_line('-----------------');
dbms_output.put_line('Updating Status. Customer Id: ' || pcustid || ' New Status: ' || pstatus);
UPD_CUST_STATUS_IN_DB(pcustid, pstatus);
dbms_output.put_line('Update OK');
commit;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
dbms_output.put_line(SQLCODE);
END;
/
BEGIN
UPD_CUST_STATUS_VIASQLDEV(4, 'SUSPEND');
END;
Actual result: Updating Status. Customer Id: 4 New Status: SUSPEND
Update OK
Expected result: Updating Status. Customer Id: 4 New Status: SUSPEND
ORA-20122:ERROR:CUSTOMER ID NOT FOUND
答案 0 :(得分:3)
NO_DATA_FOUND
是一个例外,如果SELECT
查询找不到行,则可能引发该异常。
您正在运行UPDATE
;如果它找不到要更新的行,则不会引发异常。
如果要检测到更新未找到要更新的行,则可以使用SQL%ROWCOUNT
,例如:
UPDATE CUSTOMER
SET status = pstatus
WHERE custid = pcustid;
if sql%rowcount=0 then
DBMS_OUTPUT.PUT_LINE('ORA-20122:ERROR:CUSTOMER ID NOT FOUND');
end if;
答案 1 :(得分:2)
要测试更新是否成功,可以使用
if sql%found
或
if sql%notfound
代替
WHEN NO_DATA_FOUND THEN