【问题标题】:Select in MySQL stored procedure not returning values在 MySQL 存储过程中选择不返回值
【发布时间】:2012-03-14 01:20:08
【问题描述】:

我有一个存储过程,如下所示,我创建它是为了将美元销售额添加到当前仅存储单位销售额的表 (WeeklySales) 中。光标在 WeeklySales 表上运行。定价数据存储在定价表中。定价表实际上包含价格的变化。价格变化的生效日期存储在 Pricing.effectiveDate 中,因此我必须找到在销售单位的那一周有效的定价(存储在 WeeklySales.weekStart 中)。

我遇到的问题是 IF 之后的第一个选择不返回任何内容。我已经确认,当我使用在过程内部调用它的值在过程之外运行它时,这个选择确实返回了一个值。我不确定这里出了什么问题,但我猜这可能与 this select 正在与光标不同的表上操作这一事实有关?有人知道吗?有没有更好的方法来做到这一点?

DELIMITER //

CREATE PROCEDURE `createWeeklyPricing` (IN startDate DATE, IN endDate DATE)  
BEGIN
--
-- Populate the proceeds column using the Pricing table
DECLARE product VARCHAR(255);
DECLARE weekStart DATE;
DECLARE units, done INT;
DECLARE proceeds DECIMAL(6,2);
DECLARE effectiveDate DATE;
DECLARE currentRow CURSOR FOR SELECT `weekStart`, `product`, `units` FROM `WeeklySales` WHERE `weekStart` >= startDate AND `weekStart` <= endDate;  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
OPEN currentRow;  
SET done = 0;  
WHILE done = 0 DO  
    FETCH currentRow INTO weekStart, product, units;
    IF done = 0 THEN  
        SELECT MAX(`effectiveDate`) FROM `Pricing` WHERE `effectiveDate` <= weekStart AND `product` = product INTO effectiveDate;
        SELECT `proceeds` FROM `Pricing` WHERE `effectiveDate` = effectiveDate AND `product` = product INTO proceeds;
        UPDATE `WeeklySales` SET `proceeds` = units * proceeds WHERE `weekStart` = weekStart AND `product` = product;
    END IF;
END WHILE;  
CLOSE currentRow;

END//

【问题讨论】:

  • 你可以“回显”选择,创建一个包含一个字段(文本)的表,然后在其中插入CONCAT('SELECT MAX(effectiveDate) FROM Pricing` WHERE effectiveDate product = product INTO ',effectiveDate,';')`
  • 我已将 EffectiveDate 变量写入表中,并确认它为空。我还将 weekStart 和 product 变量写入表格以确认它们是正确的值。我什至在问题选择中尝试了硬编码 weekStart 和产品。 EffectiveDate 总是返回为 NULL,但仅在存储过程中。如果我使用与存储过程案例中相同的硬编码值将 select 输入 MySQL,我会得到预期值。
  • 您是否在与直接运行查询的数据库相同的数据库上运行 SP?
  • 是的。我在 SP 中添加了一个 USE sales 行以确保。
  • 我还尝试在 IF 结束之前在 UPDATE 语句中硬编码一个值,以确保 IF 正在执行并且我正在写入正确的表。

标签: mysql stored-procedures database-cursor


【解决方案1】:

在 if 语句之前回显(选择)weekstart...

如果返回 null,则在 startDate 和 endDate 之间更改选择 FROM WeeklySales WHERE weekStart

【讨论】:

    【解决方案2】:

    你需要在FROM之前使用INTO,变量需要'@'符号

    改成

    SELECT MAX(`effectiveDate`) INTO @effectiveDate FROM `Pricing` WHERE `effectiveDate` <= weekStart AND `product` = product ;
    

    希望对你有帮助

    【讨论】:

    • 这没有效果。有效日期仍为 NULL。
    • 有效数据的数据类型是什么?是日期还是日期时间?看看吧
    【解决方案3】:

    这是因为你的变量名覆盖了你的列名:

    您有一个名为“有效日期”的变量

    您有一个名为“有效日期”的列

    SELECT MAX(`effectiveDate`) ...
    

    是 MAX-ing 变量有效日期,而不是

    尝试命名变量ma​​xEffectiveDate

    请注意变量不区分大小写。当我尝试将列 IsBackUp 选择到变量 isBackUp 中时,这发生在我身上(注意 i)。

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 2013-03-18
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多