【发布时间】: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) FROMPricing` WHEREeffectiveDateproduct = product INTO ',effectiveDate,';')` -
我已将 EffectiveDate 变量写入表中,并确认它为空。我还将 weekStart 和 product 变量写入表格以确认它们是正确的值。我什至在问题选择中尝试了硬编码 weekStart 和产品。 EffectiveDate 总是返回为 NULL,但仅在存储过程中。如果我使用与存储过程案例中相同的硬编码值将 select 输入 MySQL,我会得到预期值。
-
您是否在与直接运行查询的数据库相同的数据库上运行 SP?
-
是的。我在 SP 中添加了一个 USE
sales行以确保。 -
我还尝试在 IF 结束之前在 UPDATE 语句中硬编码一个值,以确保 IF 正在执行并且我正在写入正确的表。
标签: mysql stored-procedures database-cursor