【发布时间】:2018-04-04 07:48:17
【问题描述】:
以下代码应为 csv2 生成 3 个条目……但是生成了 6 个条目。
这是为什么呢?代码正在进行中。
创建代码:
Create table testing(
idString varchar(20),
region varchar(20)
);
insert into testing values("abcdefg","123456");
insert into testing values("bcdefgh","123456");
insert into testing values("cdefghi","123456");
insert into testing values("defghij","456789");
insert into testing values("efghijk","456789");
insert into testing values("fghijkl","456789");
要运行的代码:
DROP PROCEDURE IF EXISTS `sp_split`;
DROP PROCEDURE IF EXISTS `getCombinations`;
CREATE TABLE IF NOT EXISTS `temp` (
`col` VARCHAR(100) NOT NULL
) ENGINE=MEMORY;
CREATE TABLE IF NOT EXISTS `result` (
`col1` VARCHAR(100) NOT NULL
) ENGINE=MEMORY;
CREATE PROCEDURE getCombinations()
BEGIN
DECLARE countInt INT DEFAULT 0;
DECLARE csv varchar(100);
DECLARE region varchar(100);
DECLARE v_last_row_fetched INT;
declare v_counter int unsigned default 1;
DECLARE counter cursor for
select * from ( select region as region,
count(distinct idString) as countInt,
group_concat(idString) as csv
from testing
group by region ) temp;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_last_row_fetched=1;
SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT');
delete from result;
open counter;
c1_loop: loop
fetch counter into region , countInt, csv ;
IF v_last_row_fetched=1 THEN LEAVE c1_loop; END IF;
#DEBUG STATEMENT HERE - 6 values instead of two displayed for csv3
select csv as csv3;
LEAVE c1_loop;
end loop c1_loop;
close counter;
END;
DELIMITER ;
CALL getCombinations();
SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT');
【问题讨论】:
-
SET sql_mode='PIPES_AS_CONCAT';非常不安全,因为它会关闭您可能需要的其他 sql 模式...更好的是使用SET SESSION sql_mode = CONCAT(@@sql_mode, ',PIPES_AS_CONCAT'); -
@Raymond Nijland 谢谢。知道为什么所有元素都被连接而不是三个吗?似乎 group by 几乎被忽略了。
-
如果你有一个无条件的
leave c1_loop;语句,循环运行代码有什么意义? -
@Barmar 我正在调试。显然代码不完整。只是 group_concat 连接所有值而不是
group by region。在解决当前问题后,我并没有花时间删除我将实际使用的所有东西。 -
我看到了问题,你有一个名为
region的局部变量。
标签: mysql stored-procedures cursor mariadb