MySQL中游标的使用

简述:

这里主要研究一下,在Mysql中游标的使用,此外关注到游标使用过程中循环的调用写法


在testDB下有一个张person表,其中的成员如下图所示,


这里设计一个procedure,在这个函数中,使用到了Mysql中的游标,用于指向每一行的addr这一属性,然后把所有的addr属性合在一起,用分号分隔。

原先person表中的数据如下,

[sql]  view plain copy
  1. select name,addr from person;  


下面是整个过程的实现SQL代码

实现写法1:

[sql]  view plain copy
  1. drop procedure if exists useCursor ;  
  2. delimiter //  
  3. CREATE PROCEDURE useCursor()  
  4.   BEGIN  
  5.     DECLARE oneAddr varchar(8) default '';  
  6.     DECLARE allAddr varchar(8) default '';  
  7.     DECLARE curl CURSOR FOR SELECT addr FROM test.person;  
  8.     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET oneAddr = null;  
  9.     OPEN curl;  
  10.     FETCH curl INTO oneAddr;  
  11.     WHILE(oneAddr is not null) DO  
  12.       set oneAddr = CONCAT(oneAddr, ';');  
  13.       set allAddr = CONCAT(allAddr, oneAddr);  
  14.       FETCH curl into oneAddr;  
  15.     END WHILE;  
  16.     CLOSE curl;  
  17.     SELECT allAddr;  
  18.   END;//  
  19. call useCursor();  


实现写法2:

[sql]  view plain copy
  1. drop procedure if exists useCursor;  
  2. delimiter //  
  3. CREATE PROCEDURE useCursor()  
  4.   BEGIN  
  5.     DECLARE oneAddr varchar(8) default '';  
  6.     DECLARE allAddr varchar(8) default '';  
  7.     DECLARE done INT DEFAULT 0;  
  8.     DECLARE curl CURSOR FOR SELECT addr FROM test.person;  
  9.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
  10.     OPEN curl;  
  11.     REPEAT  
  12.       FETCH curl INTO oneAddr;  
  13.       IF NOT done THEN  
  14.         set oneAddr = CONCAT(oneAddr, ';');  
  15.         set allAddr = CONCAT(allAddr, oneAddr);  
  16.       END IF;  
  17.     UNTIL done END REPEAT;  
  18.     CLOSE curl;  
  19.     select allAddr;  
  20.   END;//  
  21. call useCursor();  

实现写法3:

[sql]  view plain copy
  1. drop procedure if exists useCursor;  
  2. delimiter //  
  3. CREATE PROCEDURE useCursor()  
  4.   BEGIN  
  5.     DECLARE oneAddr varchar(8) default '';  
  6.     DECLARE allAddr varchar(8) default '';  
  7.     DECLARE done bool DEFAULT false;  
  8.     DECLARE curl CURSOR FOR SELECT addr FROM test.person;  
  9.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;  
  10.     OPEN curl;  
  11.     personLoop: LOOP  
  12.       FETCH curl INTO oneAddr;  
  13.       IF done THEN  
  14.         LEAVE personLoop;  
  15.       ELSE  
  16.         set oneAddr = CONCAT(oneAddr, ';');  
  17.         set allAddr = CONCAT(allAddr, oneAddr);  
  18.       END IF;  
  19.     END LOOP personLoop;  
  20.     CLOSE curl;  
  21.     select allAddr;  
  22.   END;//  
  23. call useCursor();  


结果输出:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值