Выберите в MySQL хранимую процедуру, не возвращающую значения - PullRequest
3 голосов
/ 14 марта 2012

У меня есть хранимая процедура, показанная ниже, которую я создал, чтобы добавить продажи в долларах к таблице (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//

Ответы [ 3 ]

0 голосов
/ 14 марта 2012

вам нужно использовать INTO до FROM, а переменные нужно '@' знак

изменить его на

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

надеюсь, это поможет

0 голосов
/ 28 мая 2014

Это потому, что имя вашей переменной перезаписывает имя вашего столбца:

У вас есть переменная с именем'ffectiveDate '

У вас есть столбец с именем'ffectiveDate'

SELECT MAX(`effectiveDate`) ...

МАКСИМАЛЬНО ли переменная ffectiveDate, а не столбец

Попробуйте присвоить имя переменной maxEffectiveDate

Остерегайтесь этогопеременные нечувствительны к регистру.Это случилось со мной, когда я попытался выбрать столбец IsBackUp в переменную isBackUp (обратите внимание на i).

0 голосов
/ 14 марта 2012

echo (выберите) недельный запуск перед оператором if ...

Если возвращается ноль, измените выбор ОТ WeeklySales ГДЕ weekStart между startDate И endDate

...