【问题标题】:MYSQL - Combine multiple result sets in stored procedureMYSQL - 在存储过程中组合多个结果集
【发布时间】:2014-11-10 13:54:43
【问题描述】:

我有以下存储过程:

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 在单独的窗口中。

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

【问题讨论】:

  • 我删除了 SQL Server 标签,因为这是关于 MySQL 的

标签: mysql sql stored-procedures prepared-statement


【解决方案1】:

每个 EXECUTE 都会产生一个新的结果集。所以如果你想要一个结果集,你必须只执行一次。

您可以创建一个由六个子 SELECT 和 UNION ALL 粘合在一起的 SELECT:

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;

顺便说一句,如果您通过创建子表以第一范式存储数据,这会简单得多,因此六个 LOCn_Status 列可以存储为六行中的一列。

【讨论】:

  • 嗨,比尔,我已经尝试了您的建议,但我仍然只在 EXECUTE 语句中得到一列。以第一范式存储我的数据是什么意思?
  • 不知道你想要什么。请在上面编辑您的问题,并举例说明您希望得到的结果。
  • 嗨,Bill,我再次查看了您的查询,发现由于 UNION,我的所有列现在都显示在一起。是否可以在同一个 EXECUTE 语句中按列显示它们?
  • 如果您希望列按列显示,那么您为什么要首先形成动态SQL查询?为什么不简单地SELECT * FROM table_sample?没有 WHILE 循环,没有 PREPARE,没有 EXECUTE。
  • 因为我从中选择的表不仅包含这些列,而且我需要选择的列超过 5 个(发布的代码只是一个示例)。我会采纳您的第一个建议,并首先尝试将我的数据存储在第一范式中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多