为啥我在使用 UPDATE 代码时没有收到 No_data_found 错误?

Posted

技术标签:

【中文标题】为啥我在使用 UPDATE 代码时没有收到 No_data_found 错误?【英文标题】:Why am I not getting No_data_found error when using UPDATE code?为什么我在使用 UPDATE 代码时没有收到 No_data_found 错误? 【发布时间】:2019-09-13 03:58:45 【问题描述】:

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

【问题讨论】:

顺便说一句,你不应该在不重新引发异常的情况下使用when others then 【参考方案1】:

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;

【讨论】:

【参考方案2】:

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

if sql%found

if sql%notfound

而不是

WHEN NO_DATA_FOUND THEN

见PL/SQL User's Guide and Reference

【讨论】:

以上是关于为啥我在使用 UPDATE 代码时没有收到 No_data_found 错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在编译时收到以下错误:[关闭]

为啥我在使用 Google Maps API 时没有收到“同源政策”警告?

为啥我在使用 GCD 时收到错误 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

为啥我在写 = 而不是 == 时没有收到警告?

我在解析 JSON 时遇到错误。为啥我会收到这个错误?

为啥我在安装 pip 后立即收到 ImportError: No module named pip '?