Oracle pl/sql 更新表的过程 - 异常处理

Posted

技术标签:

【中文标题】Oracle pl/sql 更新表的过程 - 异常处理【英文标题】:Oracle pl/sql Procedure to update table - exception handling 【发布时间】: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');

【问题讨论】:

【参考方案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 解决方案效果很好。

以上是关于Oracle pl/sql 更新表的过程 - 异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Pl Sql 过程在使用 oracle 调度程序进行调度时处理异常

调用 Restful Web 服务和更新数据库表的 PL/SQL 过程

预定义的 ORACLE PL/SQL 异常在哪里?

Oracle的PL_SQL的异常处理

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

ORA-06510: PL/SQL: 未处理的用户定义异常 [Oracle]