我现在正在学习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)
并定义你的
| 归档时间: |
|
| 查看次数: |
50790 次 |
| 最近记录: |