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

mysql 存储过程中利用游标循环结果集

2015-01-30 15:47 423 查看
<p>有这么个需求</p><p>
</p><p>topic表中有id 和comments数量</p><p>
</p><p>commemt表中有 topicid 和id</p><p>
由于历史原因,【删除评论表中时未同步删除topic中评论数量的值】,</p><p>所以要求一条语句执行更新。(当然用php写个foreach也可以)。

<pre name="code" class="sql">drop procedure if exists add_demo;
# 创建存储过程 add_test

CREATE PROCEDURE add_demo()

BEGIN
#定义 变量
#a 评论数量
#b id话题

DECLARE a int;
DECLARE b int;
#此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道

DECLARE str VARCHAR(300);
DECLARE x int default 123;
#这个用于处理游标到达最后一行的情况

DECLARE s int default 0;

#声明游标cursor_name(cursor_name是个多行结果集)

DECLARE cursor_name CURSOR FOR select count(topicid), topicid from t_comment group by topicid;

#设置一个终止标记

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;

set str = "--";
#打开游标

OPEN cursor_name;

#获取游标当前指针的记录,读取一行数据并传给变量a,b

fetch  cursor_name into a,b;
#开始循环,判断是否游标已经到达了最后作为循环条件

while s <> 1 do
set str =  concat(str,b);

update t_topic set comments =a where id =b;
#读取下一行的数据

fetch  cursor_name into a,b;

end while;

#关闭游标

CLOSE cursor_name ;

select str;

set @aa='12';
select @aa;

#语句执行结束
END;
#调用存储函数add_test

CALL add_demo()


当然也可以利用临时表来创建,

感谢波波的分享。





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