Mysql 使用游标/循环从存储过程返回单个集合中的数据

Mysql 使用游标/循环从存储过程返回单个集合中的数据,mysql,cursor,mysql-5.6,Mysql,Cursor,Mysql 5.6,我想在单个集合中返回数据,但是我在单个行中得到10个不同的输出。我希望在单个集合中有10行: 如果存在日历,则删除表; 删除程序(如果存在)p_生成p_快照; 创建表格日历日期; 插入日历日期值 '2020-11-01', '2020-11-02', '2020-11-03', '2020-11-04', '2020-11-05', '2020-11-06', '2020-11-07', '2020-11-08', '2020-11-09', '2020-11-10'; 分隔符$$ 创建过程p_

我想在单个集合中返回数据,但是我在单个行中得到10个不同的输出。我希望在单个集合中有10行:

如果存在日历,则删除表; 删除程序(如果存在)p_生成p_快照; 创建表格日历日期; 插入日历日期值 '2020-11-01', '2020-11-02', '2020-11-03', '2020-11-04', '2020-11-05', '2020-11-06', '2020-11-07', '2020-11-08', '2020-11-09', '2020-11-10'; 分隔符$$ 创建过程p_生成快照开始日期、结束日期 开始 宣布终止日期; 声明done INT DEFAULT FALSE; 为从日历c中选择*声明游标名称游标,其中日期>=开始日期和日期<结束日期; 声明未找到的继续处理程序SET done=TRUE; 打开游标名称; 获取循环:循环 将游标名称提取到d中; 如果这样做的话 离开fetch_循环; 如果结束; 选择d; 端环; 关闭光标和名称; 结束$$ 定界符; 调用p_generate_snapshot'20201101'、'20201201';
现在还不清楚为什么要使用光标。您的程序可以写成:

CREATE PROCEDURE p_generate_snapshot(start_date date, end_date date)
BEGIN  
   SELECT * FROM calendar c WHERE date >= start_date AND date < end_date;
END
对于这一点,我完全不知道为什么要使用过程,而不是在客户机应用程序中运行SELECT语句。这将解决这两个问题—逐个处理行,但仍将其视为单个查询结果


我几乎从不在MySQL中使用存储过程。我发现他们真的比他们值得的麻烦多。我在这里发布了原因:

逻辑将更加复杂,我给出了最少的例子。哦。。。我应该在声明后创建临时表。。。那是我的另一个错误:谢谢!是的,文档声明所有DECLARE语句必须位于过程体的顶部,在任何其他类型的语句之前。
CREATE PROCEDURE p_generate_snapshot(start_date date, end_date date)
BEGIN
  
   DECLARE _d date;
   DECLARE done INT DEFAULT FALSE;

   DECLARE cursor_name CURSOR FOR SELECT date FROM calendar c WHERE date >= start_date AND date < end_date;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

   CREATE TEMPORARY TABLE t (d DATE);

   OPEN cursor_name;
     fetch_loop: LOOP
       FETCH cursor_name INTO _d;

       IF done THEN  
         LEAVE fetch_loop;
       END IF;

       INSERT INTO t SET d = _d;
     
     END LOOP;
   CLOSE cursor_name;

   SELECT d FROM t;
   DROP TABLE t;
END