这是我的程序:
create or replace procedure p1(p_deptno in number)
is
cursor c is select * from emp where deptno=p_deptno;
i emp%rowtype;
begin
open c;
loop
fetch c into i;
exit when c%notfound;
dbms_output.put_line(i.ename);
end loop;
exception
when no_data_found then
dbms_output.put_line('Give proper deptno');
end p1;
/
当我使用SQL * Plus运行它时,我得到了这个:
SQL> exec p1(70);
PL / SQL程序已成功完成。
但deptno 70不可用。应该提出例外,但事实并非如此。我做错了什么?
答案 0 :(得分:3)
使用RAISE_APPLICATION_ERROR如果我们需要为此特定错误消息显示用户定义的错误,那么这将更合适。
CREATE OR REPLACE PROCEDURE p1(
p_deptno IN NUMBER)
IS
i emp%rowtype;
BEGIN
SELECT * INTO i FROM emp WHERE deptno=p_deptno;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR(-20001,'Dept no '||p_deptno||' has no data',TRUE);
END p1;
答案 1 :(得分:2)
找不到数据只有在您激活select(不是游标)时才会引发异常。以下是基于您的代码的示例:
create or replace procedure p1(p_deptno in number)
is
i emp%rowtype;
begin
select * into i
from emp where deptno=p_deptno;
exception
when no_data_found then
dbms_output.put_line('Give proper deptno');
end p1;
/
您可以根据Gavin所证明的%NOTFOUND引发异常。
此外,第一次从打开的游标获取,cursor_name%NOTFOUND返回NULL。此后,如果最后一次提取返回一行,则返回FALSE;如果最后一次提取未能返回一行,则返回TRUE。 (https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems011.htm)
答案 2 :(得分:1)
您需要致电RAISE
(文档链接here)
IF i IS NULL THEN
RAISE no_data_found;
END IF;