我现在正在学习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,它应该抛出异常,我应该真正得到我在异常中输入的消息。
非现有记录上的更新也发生了同样的事情。 请指教。感谢
答案 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;
并定义您的