У меня есть хранимая процедура, показанная ниже, которую я создал, чтобы добавить продажи в долларах к таблице (WeeklySales), в которой в настоящее время хранятся только продажи за единицу.Курсор работает с таблицей WeeklySales.Данные о ценах хранятся в таблице цен.Таблица цен на самом деле содержит изменения цен.Дата вступления в силу изменения цены хранится в Pricing.effectiveDate, поэтому мне нужно найти цену, которая действовала в течение недели, в которую была продана единица (которая хранится в WeeklySales.weekStart).
у меня проблема в том, что первый выбор после IF ничего не возвращает.Я подтвердил, что этот select возвращает значение, когда я запускаю его вне процедуры, используя значения, которые он будет вызывать внутри процедуры.Я не уверен, что здесь не так, но я предполагаю, что это может быть связано с тем фактом, что этот 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//