日期:2014-05-17  浏览次数:21134 次

如何判断游标中有没有记录!
我的函数中用一个引用游标,数据量非常大,我想判断游标中没有数据
------最佳解决方案--------------------
引用:
我的函数中用一个引用游标,数据量非常大,我想判断游标中没有数据


一般都是先Fetch一下,执行完Fetch的操作后,再利用%NOTFOUND 判断是否有数据:
IF cur_a%NOTFOUND THEN --表示Cursor中没有数据;

如果楼主想不执行Fetch就判断Cursor是否有数据的话,只能先select count(*) into vn_cnt where (把Cursor的所有条件都加上),判断vn_cnt是否=0喽。

因为对于Cursor来说,只Open,不Fetch的时候,Cursor是不会知道到底有多少数据的。
------其他解决方案--------------------
对,楼上说的有隐身游标的判断方法。
  %FOUND        只有在DML语句影响一行或多行时%FOUND属性才返回true,当返回为NULL值时,则为false.
        %NOTFOUND与%FOUND相反,当没有影响到一行时%NOTFOUND属性返回false,当DML语句影响一行或多行时,则返回false.
        %ROWCOUNT返回DML语句影响的行数.如果DML语句没有影响任何行,则返回0.
        %ISOPEN        %ISOPEN返回游标是否已打开的值,在执行SQL语句之后,Oracle自动关闭游标,所以隐式游标的%ISOPEN属性始终为false.
        隐式游标属性的使用:
        SQL%隐式游标的属性
------其他解决方案--------------------
游标有一个属性 %FOUND 和 %NOTFOUND 判断是否找得到数据
------其他解决方案--------------------
--cursor cur
if cur%rowcount = 0 then
  --记录为0
else
  --有记录
end if;
------其他解决方案--------------------
引用:
--cursor cur
if cur%rowcount = 0 then
  --记录为0
else
  --有记录
end if;


当游标不 fetch,%ROWCOUNT 属性就一直是 0,所以根据这个判断是没有用的
------其他解决方案--------------------
那你fetch一下,判断有没数据不就知道你想要结果了
------其他解决方案--------------------
楼上正解,要先fetch,再用游标的%found来判断是否为空
------其他解决方案--------------------
我这边有个奇怪的问题,定义游标Fetch都没报错,但就是没数据,可数据库明明有数据啊(按定义游标一样的条件查的),这是为啥?楼主这个我正想试试!
------其他解决方案--------------------
thank you 。谢谢大家的解答