更新/删除不存在的行时的 PL/SQL 异常

Posted

技术标签:

【中文标题】更新/删除不存在的行时的 PL/SQL 异常【英文标题】:PL/SQL Exceptions on Update/Delete of non-existing row 【发布时间】:2012-01-12 20:33:44 【问题描述】:

这些天我正在学习 PL/SQL,目前正在使用 oracle HR 模式处理过程和异常。

这是我的简单程序。

create or replace
PROCEDURE DEL_JOB
(p_jobid jobs.job_id%TYPE)
AS 
sqle NUMBER; 
sqlm VARCHAR2(300);
BEGIN
DELETE FROM JOBS 
WHERE JOB_ID = UPPER(p_jobid);
IF SQL%NOTFOUND THEN
  DBMS_OUTPUT.PUT_LINE('No such record');
END IF;
EXCEPTION
 WHEN OTHERS THEN
  sqle := SQLCODE;
  sqlm := SQLERRM;
  DBMS_OUTPUT.PUT_LINE('There is no job with this id that could be deleted');
  DBMS_OUTPUT.PUT_LINE('Error Code ='||sqle||' Error message =' ||sqlm);
END;

当我执行这个过程时,输出是

  No such record
  PL/SQL procedure successfully complete. 

但是,根据 Oracle PDF,它应该引发异常,我应该真正得到我在异常中输入的消息。

更新不存在的记录也发生了同样的事情。 请指教。谢谢

【问题讨论】:

【参考方案1】:

我相信SQL%NOTFOUND 在没有找到记录时会返回true。在这种情况下,您的 IF 将评估为 true,因此将您的 put_line 写入终端。 SQL 语句执行成功。如果您从命令行单独执行该 SQL 语句,您将收到 0 行更新/删除,而不是 Oracle 错误。

如果您想抛出异常,可以在 IF 中使用 RAISE 并将其指向您要抛出的异常块中的异常。

【讨论】:

【参考方案2】:

没有“异常”——sql执行成功。它成功删除了符合条件的每条记录......这是 0 条记录。如果执行了类似的更新语句,则相同。您使用 SQL%NOTFOUND 确定没有记录受到影响,但这并不意味着存在“异常”。

如果您尝试“select into”子句并且找不到任何匹配的记录,也许您正在考虑引发的 NO_DATA_FOUND 异常。

【讨论】:

是的,我认为相同,但“Oracle 数据库 11g 开发 PL/SQL 程序单元 Vol1”pdf 说明应该有例外。只是想确认我没有遗漏任何东西,谢谢。【参考方案3】:

为此,您需要使用

IF SQL%ROWCOUNT = 0 THEN
    RAISE no_delete;
END IF;

并定义你的

【讨论】:

以上是关于更新/删除不存在的行时的 PL/SQL 异常的主要内容,如果未能解决你的问题,请参考以下文章

表或视图在外壳中不存在异常

动态 SQL 的 Oracle PL/SQL 异常

如何在 PL/SQL 中增量集成数据

动态 SQL/异常处理 -00942 - Oracle PL/SQL [重复]

我的 PL/SQL 过程异常似乎不起作用

当源表中不存在相关行时更新