【问题标题】:mysql - initialize local variable (in stored procedure) from a query resultmysql - 从查询结果初始化局部变量(在存储过程中)
【发布时间】:2017-02-07 11:44:11
【问题描述】:

我正在尝试创建一个存储过程,该过程将执行显示为结束前行的选择。它会从我的用户表中获取最早的 StartDate 和最新的 EndDate,并从我的参考日历表中选择这些日期之间的所有日期。不幸的是,无论我尝试使用什么语法,在将用户表选择中的值分配给开始/结束日变量时,我总是会收到一条错误消息。我没有从我看到的示例中找到许多指定正确语法的资源,我尝试了以下方法。

DELIMITER $$
CREATE PROCEDURE seldays() 

BEGIN 

DECLARE startday DATE;
SET startday = (SELECT MIN(StartDate) from user1table1);
DECLARE endday DATE;
SET endday = (SELECT MAX(EndDate) from user1table1);
SELECT calendar_date FROM calendar WHERE calendar_date >= startday AND calendar_date< endday;

END $$
DELIMITER ;

我也尝试过这样赋值

SELECT MIN(StartDate) from user1table1 INTO endday;

无济于事。我也许可以在不存储这些变量的情况下使程序工作——但无论如何我迟早会需要使用它。 那么如何在Mysql中正确地用查询结果填充局部变量呢?

【问题讨论】:

  • 为什么不简单 SELECT calendar_date FROM calendar c, (SELECT MIN(StartDate) mindate, MAX(StartDate) maxdate from user1table1) u where c.calendar_date &gt;= u.mindate and c.calendar_date &lt;= u.maxdate) ?为什么是过程而不是简单的选择?
  • 声明变量应该在顶部
  • 谢谢 Ankit Agrawal,我错过了这么简单的事情

标签: mysql sql stored-procedures local-variables


【解决方案1】:

我会在一个查询中执行此操作。为什么要为变量烦恼?

SELECT c.calendar_date
FROM calendar c JOIN
     (SELECT MIN(StartDate) as startday, MAX(EndDate) as endday
      FROM user1table1
     ) u
     ON c.calendar_date >= u.startday AND c.calendar_date < u.endday;

【讨论】:

  • 可以工作 - 但我想有一天我可能需要一种方法将一些查询结果存储在局部变量中,但它现在似乎不起作用。
【解决方案2】:

感谢评论 Ankit Agrawal 的“声明变量应该在顶部”..

我可以得出结论,这件事得到了回答。我将此帖子作为正确答案发布,因此如果有人有同样的问题,他们可以快速查看。

DECLARE 只能在 BEGIN ... END 复合语句中使用,并且必须位于其开头,在任何其他语句之前。

DELIMITER $$
CREATE PROCEDURE seldays() 

BEGIN 

DECLARE startday DATE;
DECLARE endday DATE;
SELECT MIN(StartDate) INTO startday FROM user1table1;
SELECT MAX(EndDate) INTO endday FROM user1table1;
SELECT calendar_date FROM calendar WHERE calendar_date >= startday AND calendar_date< endday;

END $$
DELIMITER ;

【讨论】:

  • 我们可以用这种方式从一个查询中初始化多个变量吗?
【解决方案3】:

在 MySQL 中,您可以使用 select ... into &lt;variable list&gt; from ... statement 来分配结果变量:

select min(StartDate) into startday from user1table1;
select max(EndDate) into endday from user1table1;

【讨论】:

  • 嗯试过还是有错误。 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'DECLARE endday DATE; 附近使用的正确语法;
  • 您的错误信息与为变量赋值无关,您的整个问题具有误导性。
  • 你的第二个声明应该被移到前面。所有声明都必须在任何其他声明之前。
【解决方案4】:
SELECT MIN(StartDate) into startday from user1table1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2018-09-23
    • 2021-03-17
    相关资源
    最近更新 更多