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

时间:2012-01-12 20:33:45

标签: 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;

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

  No such record
  PL/SQL procedure successfully complete. 

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

非现有记录上的更新也发生了同样的事情。 请指教。感谢

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:2)

这样做你需要使用

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

并定义您的