先解释一下要实现的功能:随机生成一个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。
请各位大神帮忙。重赏
------解决方案--------------------
缺少fetch into语句
fetch into 完成之后才能通过 if curRand%notfound then判断
------解决方案--------------------
这个按说用不到游标的
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;