一个过程中间出现的问题

MySql 码拜 9年前 (2016-02-22) 1028次浏览
写了个过程,但是指针curSid执行一次就停了,不知道为什么
如下图,这个sql查出的数据是不止一条的

BEGIN
	#Routine body goes here...
DECLARE m BIGINT DEFAULT 0;
DECLARE a VARCHAR(20);
DECLARE o VARCHAR(10);
DECLARE r VARCHAR(255);
DECLARE c VARCHAR(30);
DECLARE cc VARCHAR(30);
DECLARE done BIGINT;
DECLARE curSid CURSOR FOR SELECT app,channel,SUM(revenue) FROM YJ GROUP BY channel;
#DECLARE curSid CURSOR FOR SELECT id from area;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET done = 0;
OPEN curSid;
REPEAT
	FETCH curSid INTO a,c,r;
	IF done <> 1 THEN	#Key statement
	SET cc = SUBSTRING_INDEX(c,"YJ_451_",-1);
	SELECT merchant_id INTO m FROM amg.cp_sky_charge WHERE channel_child = cc LIMIT 1;
	INSERT INTO amg.cp_sky_charge_copy VALUES(null, NOW(), m, a, cc, "移动", r, "", "");
	END IF;
UNTIL done = 1  END REPEAT;
CLOSE curSid;
#SELECT c;
#SELECT a;
#SELECT * from cp_sky_charge WHERE DATE(date)=curdate;
END

一个过程中间出现的问题

解决方案

10

BEGIN
#Routine body goes here…
DECLARE m BIGINT DEFAULT 0;
DECLARE a VARCHAR(20);
DECLARE o VARCHAR(10);
DECLARE r VARCHAR(255);
DECLARE c VARCHAR(30);
DECLARE cc VARCHAR(30);
DECLARE done BIGINT;
DECLARE done_o BIGINT;

DECLARE curSid CURSOR FOR SELECT app,channel,SUM(revenue) FROM YJ GROUP BY channel;
#DECLARE curSid CURSOR FOR SELECT id from area;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET done = 0;

OPEN curSid;
REPEAT
FETCH curSid INTO a,c,r;
IF done <> 1 THEN    #Key statement
SET cc = SUBSTRING_INDEX(c,”YJ_451_”,-1);
SET done_o = done;
SELECT merchant_id INTO m FROM amg.cp_sky_charge WHERE channel_child = cc LIMIT 1;
INSERT INTO amg.cp_sky_charge_copy VALUES(null, NOW(), m, a, cc, “移动”, r, “”, “”);

SET done = done_o;

END IF;
UNTIL done = 1  END REPEAT;
CLOSE curSid;

#SELECT c;
#SELECT a;
#SELECT * from cp_sky_charge WHERE DATE(date)=curdate;
END

30

引用 6 楼 snakec0047 的回复:
Quote: 引用 5 楼 yupeigu 的回复:
Quote: 引用 4 楼 snakec0047 的回复:
Quote: 引用 1 楼 yupeigu 的回复:

本人觉得有可能是:
SELECT merchant_id INTO m FROM amg.cp_sky_charge WHERE channel_child = cc LIMIT 1;
这句,没有找到数据,于是 done 被置为1,于是 就退出了 repeat循环了。

本人试了一下注掉那句确实可以,但是还是上面那个问题,本人想不通

那你有数据不,贴点数据出来,本人帮你试试,不然没数据,不好测

也就是说其实13行那句表达的意思是,不一定是游标,只要有查不到数据的情况就会执行是吧?

对的,就是在意思


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个过程中间出现的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)