在MySQL存储过程中选择不返回值

时间:2012-03-14 01:20:09

标签: mysql stored-procedures database-cursor

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

我遇到的问题是IF之后的第一个选择不会返回任何内容。我已经确认,当我在程序之外运行它时,它会返回一个值,使用在程序中调用的值。我不确定这里有什么问题,但我猜这可能与这个选择是在一个与光标不同的表上运行的事实有关吗?谁知道?有更好的方法吗?

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//

3 个答案:

答案 0 :(得分:0)

在if语句之前

echo(select)weekstart ...

如果返回null,则更改startDate和endDate之间的select FROM WeeklySales WHERE weekStart

答案 1 :(得分:0)

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

将其更改为

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

希望这会有所帮助

答案 2 :(得分:0)

这是因为您的变量名称会覆盖您的列名:

您有一个名为'effectiveDate'的变量

您有一个名为'effectiveDate'的列

SELECT MAX(`effectiveDate`) ...

MAX-ing 变量 effectiveDate,而不是

尝试命名变量 maxEffectiveDate

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