Database 为什么我在使用更新代码时没有得到“无数据”错误?

Database 为什么我在使用更新代码时没有得到“无数据”错误?,database,stored-procedures,plsql,Database,Stored Procedures,Plsql,我有以下代码,当我使用一个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_FOU

我有以下代码,当我使用一个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

NO\u DATA\u FOUND
是一个异常,如果
SELECT
查询未找到行,则可能会引发该异常

您正在运行
更新
;如果未找到要更新的行,则不会引发异常

如果要检测更新未发现要更新的行,可以使用
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;

要测试更新是否成功,可以使用

if sql%found

而不是

WHEN NO_DATA_FOUND THEN

请参见

顺便说一句,当其他人不重新引发异常时,您不应该使用。
WHEN NO_DATA_FOUND THEN