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

<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()

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

感谢波波的分享。



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值