我有以下存储过程:
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
在一个单独的窗口中。
是否仍然要将这些列组合到一个表中,但仍然按列显示数据?
答案 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
列可以作为一列存储在六行中。