在PL / SQL中打开游标后捕获NO_DATA_FOUND异常的正确方法

时间:2017-01-18 05:36:23

标签: oracle plsql cursor

我有两种方法可以捕获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;

但是,两者都不起作用......由于一些奇怪的原因,光标没有返回数据......我的最终解决方案是离开使用游标......结果以另一种方式返回

1 个答案:

答案 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;