我有两种方法可以捕获NO_DATA_FOUND异常(第二种方法不能正确捕获异常......)
第一种方式
create or replace package body pkg_mnt_departments is
procedure p_get_data(ls_cursor out sys_refcursor) is
begin
begin
open ls_cursor for
select field1, field2 from mytable
where 1 = 2;
exception
when others then
dbms_output.put_line('Exception');
end;
end p_get_data;
end pkg_mnt_departments;
第二种方式
procedure get_data(id in number,
l_cursor out sys_refcursor)
is
begin
if (condition1) then
open l_cursor for
select field1, field2
from mytable
where fieldid = id;
fetch l_cursor into v_field1, v_field2;
if(v_field1 is null) then
--Execute sentences when cursor is empty
end if;
end if;
end;
我想这些方法是正确的。第一种方式不起作用,但第二种方式不行......但我想,如果我做的是正确的事情。
PD:在某些情况下,第二种方式不起作用......我在程序之外执行查询并返回行,但是当它由程序执行时,不要......我不会...知道索引字段(fieldid)的事实是否已经影响。 谢谢你的帮助:))更新
我的程序做了一些改动:
程序get_data(id,数量, l_cursor out sys_refcursor) 是
begin
if (condition1) then
open l_cursor for
select field1, field2
from mytable
where fieldid = id;
fetch l_cursor into v_field1, v_field2;
if(l_cursor%rowcount = 0) then
--Execute sentences when cursor is empty
end if;
end if;
end;
但是,两者都不起作用......由于一些奇怪的原因,光标没有返回数据......我的最终解决方案是离开使用游标......结果以另一种方式返回
答案 0 :(得分:0)
仅当NO_DATA_FOUND
子句不返回任何行时才会引发SELECT ... INTO ...
异常。使用显式游标和FETCH
语句时不会引发它。
我认为一般来说,无论是使用隐式游标还是显式游标,都是风格/偏好的问题。我不是真正的开发者,所以其他人可能希望在此发表评论。但是,一个隐含的游标预计会获取0或1行。如果它取0,那么你得到NO_DATA_FOUND。 显式游标用于0到多行。所以你通常会在一个循环中打开游标,在那里你将FETCH变成变量。在这种情况下,您正在测试“End Of Fetch”。有一个cusror变量可用于测试 - %NOTFOUND。这用于退出循环,如
open c1
LOOP
fetch c1 into var;
exit when c1%notfound;
-- do stuff
END LOOP;
close c1;