mysql游标和嵌套游标

一.游标的基本使用

1.定义游标 

declare fetchSeqCursor cursor for select seqname, value from sys_sequence;   
使用游标  
open fetchSeqCursor;  
fetch数据: 
fetch  fetchSeqCursor   into _seqname, _value;   
关闭游标:  
close fetchSeqCursor; 

2.遍历方式

repeat方式:

DROP PROCEDURE IF EXISTS `NestedCurosr`;
delimiter //
CREATE PROCEDURE `NestedCurosr`()
BEGIN
  DECLARE  Done_nested  INT   DEFAULT   0 ;
  DECLARE i_server_idx, i_type INT default 0;
  DECLARE  rs_reward  CURSOR   FOR   select id from reward_content;
  DECLARE  CONTINUE  HANDLER  FOR  SQLSTATE  '02000'   SET  Done_nested = 1 ;

 OPEN rs_reward;  
  
  REPEAT
  FETCH rs_reward INTO i_type;  
  IF   NOT  Done_nested  THEN
    select concat(' type', i_type); 
  end if;
  UNTIL Done_nested END  REPEAT;
  CLOSE rs_reward;  
 
END //
delimiter ;

注意:假设t表有n条记录,这个循环体循环n次?

实际上是n+1次。因为到达t的最后一行的时候stopFlag还是1。这个值的修改是在下一次fetch的时候改的,但是改完后就进入begin了,没有再判断,所以会多执行一次。这多出来的一次的temp_f的值和上一次相同。

 解决方法:在进入Begin之后再判断一下stopFlag的值


Loop方式:

DROP PROCEDURE IF EXISTS `NestedCurosr`;
delimiter //
CREATE PROCEDURE `NestedCurosr`()
BEGIN
  DECLARE  Done_nested  INT   DEFAULT   0 ;
  DECLARE i_server_idx, i_type INT default 0;
  DECLARE  rs_reward  CURSOR   FOR   select id from reward_content;
  DECLARE  CONTINUE  HANDLER  FOR  SQLSTATE  '02000'   SET  Done_nested = 1 ;

  OPEN rs_reward;
    reward_loop: LOOP      -- Loop through class in grade.
      FETCH rs_reward INTO i_type;
	  IF Done_nested=1 THEN
         LEAVE reward_loop;
      END IF;
      select concat(' type', i_type);
    END LOOP reward_loop;
    CLOSE rs_reward;
 
END //
delimiter ;

        二.嵌套游标

        mysql的嵌套游标的使用有别于单级游标,主要区别在于使用了不方便使用repeat方式,而是用Loop方式,上代码。

        关于error handler( 注意在 Mysql 里同一个 error 的 handler 只能定义一次, 多定义的话,在compile 的过程中会提示里duplicate handler defination ,所以 NOT FOUND 的 hand ler就只能定义一次 )。

        

DROP PROCEDURE IF EXISTS `NestedCurosr`;
delimiter //
CREATE PROCEDURE `NestedCurosr`()
	#LANGUAGE SQL
	#DETERMINISTIC
	#CONTAINS SQL
	#COMMENT ''
BEGIN
  DECLARE  Done_nested  INT   DEFAULT   0 ;
  DECLARE i_server_idx, i_type INT default 0;
  DECLARE  rs_server  CURSOR   FOR   select server_idx from server_config;
  DECLARE  rs_reward  CURSOR   FOR   select id from reward_content;
  DECLARE  CONTINUE  HANDLER  FOR  SQLSTATE  '02000'   SET  Done_nested = 1 ;

  #level
  OPEN  rs_server;
   server_loop: LOOP
    FETCH   NEXT   FROM  rs_server  INTO   i_server_idx;
	IF Done_nested=1 THEN
       LEAVE server_loop;
    END IF;
     select concat(' serverIdx:', i_server_idx);
    
    OPEN rs_reward;
    reward_loop: LOOP      -- Loop through class in grade.
      FETCH rs_reward INTO i_type;
	  IF Done_nested=1 THEN
         LEAVE reward_loop;
      END IF;
      select concat(' type', i_type);
    END LOOP reward_loop;
    CLOSE rs_reward;
    SET Done_nested=0;
    
    
    END LOOP server_loop;
  CLOSE  rs_server;
 
END //
delimiter ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值