【问题标题】:Oracle pl/sql Procedure to update table - exception handlingOracle pl/sql 更新表的过程 - 异常处理
【发布时间】:2019-01-15 21:06:55
【问题描述】:

这是我对 PL/SQL 的第一次查询,我确实花了一个小时试图在网上找到答案 - 就这样吧。

我正在编写一个更新表的过程,一切正常,但是当我输入更新不存在的job_id 时,我希望我的异常处理告诉我job_id 是无效,但是我没有收到错误消息。

我的代码如下:

CREATE OR REPLACE PROCEDURE UPD_JOB(p_job_id jobs.job_id%TYPE, p_jobnew jobs.job_title%TYPE)
IS
BEGIN
UPDATE JOBS SET job_title =p_jobnew WHERE JOB_ID = p_job_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No rows have been updated');
END;
/

然后我尝试通过键入以下内容来更新我知道不存在的 job_id 以查看异常是否有效

EXECUTE UPD_JOB('ABCXXX','WILL FAIL');

【问题讨论】:

    标签: oracle plsql exception-handling


    【解决方案1】:

    来自"Handling PL/SQL Errors":

    NO_DATA_FOUND

    SELECT INTO 语句不返回任何行,或者您的程序引用了嵌套表中的已删除元素或索引表中的未初始化元素。 SQL 聚合函数(如 AVG 和 SUM)总是返回一个值或空值。因此,调用聚合函数的 SELECT INTO 语句永远不会引发 NO_DATA_FOUND。 FETCH 语句预计最终不会返回任何行,因此当这种情况发生时,不会引发异常。

    您没有使用会导致引发NO_DATA_FOUND 异常的语句。

    也许你可以使用SQL%ROWCOUNT。来自"Performing SQL Operations from PL/SQL":

    要了解有多少行受 DML 语句影响,您可以查看 SQL%ROWCOUNT 的值...

    CREATE OR REPLACE PROCEDURE UPD_JOB (p_job_id jobs.job_id%TYPE,
                                         p_jobnew jobs.job_title%TYPE)
    IS
    BEGIN
      UPDATE JOBS
             SET job_title = p_jobnew
             WHERE JOB_ID = p_job_id;
    
      IF SQL%ROWCOUNT = 0 THEN
        DBMS_OUTPUT.PUT_LINE('No rows have been updated');
      END IF;
    END;
    /
    

    【讨论】:

    • 非常感谢。我以为我需要使用异常来生成错误消息,但 IF SQL%ROWCOUNT=0 解决方案效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    相关资源
    最近更新 更多