您的位置:首页 > 数据库 > MySQL

MySQL中游标的使用

2012-10-24 13:27 405 查看
简述:

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

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



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

原先person表中的数据如下,

select name,addr from person;




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

实现写法1:

drop procedure if exists useCursor ;
delimiter //
CREATE PROCEDURE useCursor()
BEGIN
DECLARE oneAddr varchar(8) default '';
DECLARE allAddr varchar(8) default '';
DECLARE curl CURSOR FOR SELECT addr FROM test.person;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET oneAddr = null;
OPEN curl;
FETCH curl INTO oneAddr;
WHILE(oneAddr is not null) DO
set oneAddr = CONCAT(oneAddr, ';');
set allAddr = CONCAT(allAddr, oneAddr);
FETCH curl into oneAddr;
END WHILE;
CLOSE curl;
SELECT allAddr;
END;//
call useCursor();


实现写法2:

drop procedure if exists useCursor;
delimiter //
CREATE PROCEDURE useCursor()
BEGIN
DECLARE oneAddr varchar(8) default '';
DECLARE allAddr varchar(8) default '';
DECLARE done INT DEFAULT 0;
DECLARE curl CURSOR FOR SELECT addr FROM test.person;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN curl;
REPEAT
FETCH curl INTO oneAddr;
IF NOT done THEN
set oneAddr = CONCAT(oneAddr, ';');
set allAddr = CONCAT(allAddr, oneAddr);
END IF;
UNTIL done END REPEAT;
CLOSE curl;
select allAddr;
END;//
call useCursor();


实现写法3:

drop procedure if exists useCursor;
delimiter //
CREATE PROCEDURE useCursor()
BEGIN
DECLARE oneAddr varchar(8) default '';
DECLARE allAddr varchar(8) default '';
DECLARE done bool DEFAULT false;
DECLARE curl CURSOR FOR SELECT addr FROM test.person;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
OPEN curl;
personLoop: LOOP
FETCH curl INTO oneAddr;
IF done THEN
LEAVE personLoop;
ELSE
set oneAddr = CONCAT(oneAddr, ';');
set allAddr = CONCAT(allAddr, oneAddr);
END IF;
END LOOP personLoop;
CLOSE curl;
select allAddr;
END;//
call useCursor();


结果输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: