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

Oracle 更新/删除不存在行时的PL/SQL异常,oracle,plsql,Oracle,Plsql,最近我正在学习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('N

最近我正在学习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. 
然而,根据OraclePDF,它应该抛出一个异常,我应该真正得到我在异常中输入的消息

对不存在的记录进行更新时也发生了同样的情况。 请告知。谢谢

没有“异常”-sql执行成功。它成功删除了所有符合条件的记录…即0条记录。如果执行了类似的update语句,情况也是如此。您使用SQL%NOTFOUND确定没有受影响的记录,但这并不意味着存在“异常”


如果您尝试使用“select into”子句,但未找到任何匹配的记录,则可能会出现NOU DATA FOUND异常。

我相信
SQL%NOTFOUND
在未找到任何记录时返回
true
。在这种情况下,
IF
将计算为true,因此将put\u行写入终端。SQL语句已成功执行。如果您从命令行自行执行该SQL语句,您将收到0行更新/删除,而不是Oracle错误


如果要引发异常,可以在
If
中使用
RAISE
,并将其指向要引发的异常块中的异常。

为此,需要使用

IF SQL%ROWCOUNT = 0 THEN
    RAISE no_delete;
END IF;
定义你的

是的,我也这么认为,但“Oracle Database 11g Develop PL/SQL Program Units Vol1”pdf声明应该有例外。我只是想确认我没有遗漏任何东西,谢谢。