欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

oracle 判断游标是否为空 有大用 有大大用

oracle 判断游标是否为空                

 
begin
       open cur_p;
       loop
       fetch cur_p into var_a,var_b;
       exit when cur_p%notfound;
      
       if cur_p%rowcount = 0 then
       begin
            --语句块1
            exception
                   when others then
                   null;
       end;
      
       else
       begin
            --语句块2
            exception
                   when others then
                   null;
       end;
       end if;

       end loop;
       close cur_p;
end;            

           

来自 https://www.iteye.com/blog/yuiop666-2098331            

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

lyk025212014-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。

请各位大神帮忙。重赏
1188点赞收藏7                            
 写回复                            
7 条回复
 切换为时间正序                    
当前发帖距今超过3年,不再开放新的回复
发表回复
                                   
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 的回复:
这个按说用不到游标的                                                                                                                
  1. while numRowCount < 10 loop
  2. numRand := TRUNC(dbms_random.value(1,30),0);
  3. select count(1) into i from dc_middle_rand where midRand = numRand;
  4. if i=0 then
  5. EXECUTE IMMEDIATE 'Insert into dc_middle_rand values('|| numRand ||')';
  6. commit;
  7. numRowCount := numRowCount + 1;
  8. end if;
  9. end Loop;
                                                   
这方法好,简单。。长学问了。
                                           
                                           
                                   
bw555 2014-09-01                                            
这个按说用不到游标的                                                                                                
  1. while numRowCount < 10 loop
  2. numRand := TRUNC(dbms_random.value(1,30),0);
  3. select count(1) into i from dc_middle_rand where midRand = numRand;
  4. if i=0 then
  5. EXECUTE IMMEDIATE 'Insert into dc_middle_rand values('|| numRand ||')';
  6. commit;
  7. numRowCount := numRowCount + 1;
  8. end if;
  9. 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                                            
参考                                                                                                
  1. PROCEDURE s IS
  2. v_yhbh varchar2(10);
  3. v_yhmc varchar2(60);
  4. cursor bh_list is select distinct yhbh,yhmc from dbuser_manager order by yhmc ;
  5. begin                                                            
  6. open bh_list;
  7. fetch bh_list into v_yhbh,v_yhmc;
  8. while bh_list %found loop
  9.  --你的操作                                                            
  10. fetch bh_list into v_yhbh,v_yhmc;
  11. end loop;
  12. close bh_list;
  13. END;
                                           
                                           
                                   
bw555 2014-09-01                                            
缺少fetch into语句 fetch into 完成之后才能通过 if curRand%notfound then判断                                            

来自 https://bbs.csdn.net/topics/390875259?list=lz            


           

oracle 判断游标是否为空


           

begin

open cur_p;
loop
fetch cur_p into var_a,var_b;
exit when cur_p%notfound;

if cur_p%rowcount = 0 then
begin
--语句块1
exception
when others then
null;
end;

else
begin
--语句块2
exception
when others then
null;
end;
end if;

end loop;
close cur_p;
end;


来自 https://blog.csdn.net/uoanlove/article/details/84620557



一定是在fetch之后吗?下面的逻辑如何实现?

打开游标cur_p 为空,则:
--执行语句块1;
不为空,则:
--执行语句块2;
关闭游标cur_p;
如何游标实现语句                                





使用道具 举报                            

回复                        


〇〇                            
                           
  • 论坛徽章:

  • 403

紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00                        
2#                        
 发表于 2009-12-30 15:34 | 只看该作者                            
if rusr_p.notfound




使用道具 举报                            

回复                        


XQKA                            
                           
  • 论坛徽章:

  • 73

2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46                        
3#                        
  楼主| 发表于 2009-12-30 15:39 | 只看该作者                            
这样语句块1不管何种情况都会执行。




使用道具 举报                            

回复                        


bell6248                            
                           
  • 论坛徽章:

  • 126

ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00                        
4#                        
 发表于 2009-12-30 15:45 | 只看该作者                            
判断游标相关的SQL语句是否有返回记录不就行了!




使用道具 举报                            

回复                        


jackywood                            
                           
  • 论坛徽章:

  • 90

生肖徽章:蛇
日期:2006-09-07 17:09:082011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:34现任管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:50:442012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09                        
5#                        
 发表于 2009-12-30 15:53 | 只看该作者                            
需要fetch一下

%FOUND Attribute
A cursor attribute that can be appended to the name of a cursor or cursor variable.
Before the first fetch from an open cursor, cursor_name%FOUND returns NULL.
Afterward, it returns TRUE if the last fetch returned a row, or FALSE if the last fetch failed to return a row.

%NOTFOUND Attribute
A cursor attribute that can be appended to the name of a cursor or cursor variable.
Before the first fetch from an open cursor, cursor_name%NOTFOUND returns NULL.
Thereafter, it returns FALSE if the last fetch returned a row, or TRUE if the last fetch failed to return a row.

示例如下
&lev = 1 时, cur 没有数据
&lev >1 时, cur 有数据

但不论cur中是否有数据, 在没有fetch之前, 这两个属性都是NULL(即未知)

[php]
JACKY> set serveroutput on
JACKY> declare
  2    cursor cur is select level from dual where level>1 connect by level <= &lev;
  3    tmp number;
  4  begin
  5    open cur;
  6    if cur%notfound is null then
  7      dbms_output.put_line('Before the first fetch, CURSOR %NOTFOUND  is null !!!');
  8    end if;
  9    if cur%found is null then
10      dbms_output.put_line('Before the first fetch, CURSOR %FOUND is null !!!');
11    end if;
12
13    if cur%rowcount is null then
14      dbms_output.put_line('Before the first fetch, CURSOR %ROWCOUNT is null !!!');
15    end if;
16
17    fetch cur into tmp;
18    if cur%notfound then
19      dbms_output.put_line('CURSOR is null !!! : %NOTFOUND is true');
20    end if;
21
22    if cur%found then
23      dbms_output.put_line('Use Loop Fetch Data !!! : %FOUND is true');
24    end if;
25
26    close cur;
27  end;
28  /
输入 lev 的值:  1
原值    2:   cursor cur is select level from dual where level>1 connect by level <= &lev;
新值    2:   cursor cur is select level from dual where level>1 connect by level <= 1;
Before the first fetch, CURSOR %NOTFOUND  is null !!!
Before the first fetch, CURSOR %FOUND is null !!!
CURSOR is null !!! : %NOTFOUND is true

PL/SQL 过程已成功完成。

JACKY> /
输入 lev 的值:  2
原值    2:   cursor cur is select level from dual where level>1 connect by level <= &lev;
新值    2:   cursor cur is select level from dual where level>1 connect by level <= 2;
Before the first fetch, CURSOR %NOTFOUND  is null !!!
Before the first fetch, CURSOR %FOUND is null !!!
Use Loop Fetch Data !!! : %FOUND is true

PL/SQL 过程已成功完成。

JACKY> /
输入 lev 的值:  5
原值    2:   cursor cur is select level from dual where level>1 connect by level <= &lev;
新值    2:   cursor cur is select level from dual where level>1 connect by level <= 5;
Before the first fetch, CURSOR %NOTFOUND  is null !!!
Before the first fetch, CURSOR %FOUND is null !!!
Use Loop Fetch Data !!! : %FOUND is true

PL/SQL 过程已成功完成。

JACKY>


[/php]

[ 本帖最后由 jackywood 于 2009-12-30 15:56 编辑 ]




使用道具 举报                            

回复                        


XQKA                            
                           
  • 论坛徽章:

  • 73

2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46                        
6#                        
  楼主| 发表于 2009-12-30 15:54 | 只看该作者                            
原帖由 bell6248 于 2009-12-30 15:45 发表

判断游标相关的SQL语句是否有返回记录不就行了!

在游标循环中,cur_p%ROWCOUNT是不停的变化的吗?




使用道具 举报                            

回复                        


jackywood                            
                           
  • 论坛徽章:

  • 90

生肖徽章:蛇
日期:2006-09-07 17:09:082011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:34现任管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:50:442012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09                        
7#                        
 发表于 2009-12-30 15:58 | 只看该作者                            
原帖由 XQKA 于 2009-12-30 15:54 发表


在游标循环中,cur_p%ROWCOUNT是不停的变化的吗?


%ROWCOUNT Attribute
A cursor attribute that can be appended to the name of a cursor or cursor variable.
When a cursor is opened, %ROWCOUNT is zeroed.
Before the first fetch, cursor_name%ROWCOUNT returns 0.
Thereafter, it returns the number of rows fetched so far.
The number is incremented if the latest fetch returned a row.                                            




使用道具 举报                            

回复                        


XQKA                            
                           
  • 论坛徽章:

  • 73

2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46                        
8#                        
  楼主| 发表于 2009-12-30 16:06 | 只看该作者                            
原帖由 jackywood 于 2009-12-30 15:58 发表



%ROWCOUNT Attribute
A cursor attribute that can be appended to the name of a cursor or cursor variable.
When a cursor is opened, %ROWCOUNT is zeroed.
Before the first fetch, cursor_name%ROWCOUNT returns 0.
Thereafter, it returns the number of rows fetched so far.
The number is incremented if the latest fetch returned a row.


The number is incremented if the latest fetch returned a row.
也就是说,在loop中 cur_p%ROWCOUNT最终会变成一,而不会是0?对吗?




使用道具 举报                            

回复                        


bell6248                            
                           
  • 论坛徽章:

  • 126

ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00                        
9#                        
 发表于 2009-12-30 16:13 | 只看该作者                            
原帖由 XQKA 于 2009-12-30 15:54 发表


在游标循环中,cur_p%ROWCOUNT是不停的变化的吗?



比如”cursor cur is select *****“,那你就先把“select *****“执行一下, 看看该句语句是否有返回值即可!




使用道具 举报                            

回复                        


〇〇                            
                           
  • 论坛徽章:

  • 403

紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00                        
10#                        
 发表于 2009-12-30 16:15 | 只看该作者                            


来自  http://www.itpub.net/thread-1253981-1-1.html      

普通分类: