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

Adn*_*tti 12 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('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;
Run Code Online (Sandbox Code Playgroud)

当我执行此过程时,输出为

  No such record
  PL/SQL procedure successfully complete. 
Run Code Online (Sandbox Code Playgroud)

但是,根据Oracle PDF,它应该抛出一个异常,我应该得到我在异常中输入的消息.

同样的事情发生在非现有记录上的更新.请指教.谢谢

Dan*_*Dan 12

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

如果要抛出异常,可以RAISE在内部使用IF并将其指向要抛出的异常块中的异常.


Ger*_*rat 10

没有"异常" - sql成功执行.它成功删除了符合条件的每条记录...这是0条记录.如果执行类似的更新语句,也是一样的.您使用SQL%NOTFOUND来确定没有受影响的记录,但这并不意味着存在"异常".

也许您正在考虑在尝试"select into"子句时引发的NO_DATA_FOUND异常并且它找不到任何匹配的记录.


小智 5

为此,您需要使用

IF SQL%ROWCOUNT = 0 THEN
    RAISE no_delete;
END IF;
Run Code Online (Sandbox Code Playgroud)

并定义你的