MYSQL - 在存储过程中组合多个结果集

时间:2014-09-16 17:37:17

标签: mysql sql stored-procedures prepared-statement

我有以下存储过程:

DELIMITER //

DROP PROCEDURE IF EXISTS active_locations;

CREATE PROCEDURE active_locations()

BEGIN

DECLARE y INT DEFAULT 1;
DECLARE LOC VARCHAR(200);

WHILE y < 6 DO

SELECT CONCAT('SELECT table_sample.LOC', GROUP_CONCAT(y), '_Status'
                        ' FROM table_sample') INTO @LOC;

SET y = y + 1;

PREPARE stmt FROM @LOC;
EXECUTE stmt;

END WHILE;

END//

然而,当我在Navicat中调用此过程时,我为y的每次迭代得到多个结果集(所以在这种情况下,为5)。我已经尝试将结果插入临时表但只能得到y = 1的结果。我不熟悉存储过程但我认为对于y的每个循环,MySQL正在执行 SELECT table_sample.LOC', GROUP_CONCAT(y), '_Status' ' FROM table_sample在一个单独的窗口中。

是否仍然要将这些列组合到一个表中,但仍然按列显示数据?

1 个答案:

答案 0 :(得分:1)

每个EXECUTE都会产生一个新的结果集。因此,如果您想要一个结果集,则必须只进行一次EXECUTE。

您可以创建一个由六个子SELECT组成的SELECT,它与UNION ALL粘合在一起:

SET @LOC = '';
WHILE y < 6 DO
    SET @LOC = CONCAT(@LOC, ' SELECT table_sample.LOC', y, '_Status'
                        ' FROM table_sample UNION ALL');
    SET y = y + 1;
END WHILE;

/* Now we have one extra UNION ALL at the end, so remove it. */
SET @LOC = LEFT(@LOC, LENGTH(@LOC)-LENGTH('UNION ALL'));

PREPARE stmt FROM @LOC;
EXECUTE stmt;

顺便说一句,如果您通过创建子表将数据存储在First Normal Form中,这将会更加简单,因此六个LOCn_Status列可以作为一列存储在六行中。