Oracle 判断游标返回记录是否为空

lyk02521 2014-09-01 02:36:41
先解释一下要实现的功能:随机生成一个1-30之间的整数,然后判断该数是否在数据表中存在,如存在,则重新生成;如不存在,则执行insert操作。代码如下:
while numRowCount < 10 loop
numRand := TRUNC(dbms_random.value(1,30),0);
--根据得出的随机数,从表中查询结果
open curRand for select midRand from dc_middle_rand where midRand = numRand;
--当查询结果为 0(无相关记录),则进行插入操作
if curRand%notfound then --这种判断,程序进入死循环,IF内的代码并未执行(!!!)
--if curRand%rowcount = 0 then --这种判断也失效(!!!)
EXECUTE IMMEDIATE 'Insert into dc_middle_rand values('|| numRand ||')';
commit;
numRowCount := numRowCount + 1;
end if;
close curRand;
end Loop;

问题: 本人试过利用 if curRand%notfound then 和 if curRand%rowcount = 0 then两种判断,都无法生效;
1、if curRand%notfound then:这种判断,执行时进入死循环,IF内部代码从未被执行。
2、 if curRand%rowcount = 0 then:这种判断并未生效,经常在结果中查出重复的记录。比如表中已经存在数字8,在第二次循环判断时,数字8 仍然会被insert。

请各位大神帮忙。重赏
...全文
2003 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
c_sdn_shang_bu_qi 2014-09-01
  • 打赏
  • 举报
回复
select count(1) into v_num from dc_middle_rand where midRand = numRand; if(v_um>=1) 用这个代替游标不行吗
bw555 2014-09-01
  • 打赏
  • 举报
回复
%rowcount对于游标来说 是指已经fetch出来 的行数,也就是提取的行数
lyk02521 2014-09-01
  • 打赏
  • 举报
回复
引用 4 楼 bw555 的回复:
这个按说用不到游标的
while numRowCount < 10 loop
   numRand := TRUNC(dbms_random.value(1,30),0);
   select count(1) into i from dc_middle_rand where midRand = numRand;
   if i=0 then
        EXECUTE IMMEDIATE 'Insert into dc_middle_rand values('|| numRand ||')';
        commit;
        numRowCount := numRowCount + 1;
     end if;
end Loop;
这方法好,简单。。长学问了。
bw555 2014-09-01
  • 打赏
  • 举报
回复
这个按说用不到游标的
while numRowCount < 10 loop
   numRand := TRUNC(dbms_random.value(1,30),0);
   select count(1) into i from dc_middle_rand where midRand = numRand;
   if i=0 then
        EXECUTE IMMEDIATE 'Insert into dc_middle_rand values('|| numRand ||')';
        commit;
        numRowCount := numRowCount + 1;
     end if;
end Loop;
lyk02521 2014-09-01
  • 打赏
  • 举报
回复
引用 1 楼 bw555 的回复:
缺少fetch into语句 fetch into 完成之后才能通过 if curRand%notfound then判断
那if curRand%rowcount = 0 then也是因为缺少fetch into,所以才无法生效吗?
bw555 2014-09-01
  • 打赏
  • 举报
回复
参考
PROCEDURE s IS
  v_yhbh varchar2(10);
  v_yhmc varchar2(60);
  cursor bh_list is select distinct yhbh,yhmc from dbuser_manager order by yhmc ;
begin
  open bh_list;
  fetch bh_list into v_yhbh,v_yhmc;
  while bh_list %found loop
  	--你的操作
     fetch bh_list into v_yhbh,v_yhmc;
   end loop;
  close bh_list;
END;
bw555 2014-09-01
  • 打赏
  • 举报
回复
缺少fetch into语句 fetch into 完成之后才能通过 if curRand%notfound then判断

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧