更新/删除不存在的行时的 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 异常的主要内容,如果未能解决你的问题,请参考以下文章