Объявление переменной или условия после объявления курсора или обработчика SQL-оператор (mysql) - PullRequest
0 голосов
/ 08 января 2019

, хотя я пробовал много вещей, это все еще дает мне эту ошибку (Объявление переменной или условия после объявления курсора или обработчика Оператор SQL)

sp должен использовать курсоры

CREATE PROCEDURE monthly_sum (IN cardId INT(36), IN monthN INT, OUT sumV float)
BEGIN
DECLARE cursor_1 CURSOR FOR
SELECT SUM(purchased.amountPurchased)
FROM purchased
WHERE MONTH(purchased.dateUsed) = monthN AND purchased.purchasedCardId = cardId AND DAY(purchased.dateUsed) <=10;

DECLARE cursor_2 CURSOR FOR
SELECT SUM(purchased.amountPurchased)
FROM purchased
WHERE MONTH(purchased.dateUsed)  = monthN AND purchased.purchasedCardId = cardId AND DAY(purchased.dateUsed) <=20 AND DAY(purchased.dateUsed) >10;

DECLARE cursor_3 CURSOR FOR
SELECT SUM(purchased.amountPurchased)
FROM purchased
WHERE MONTH(purchased.dateUsed) = monthN AND purchased.purchasedCardId = cardId AND DAY(purchased.dateUsed) >20;

DECLARE percentage1, percentage2, percentage3 float default 0;

OPEN cursor_1;
FETCH cursor_1
INTO percentage1;
CLOSE cursor_1;

OPEN cursor_2;
FETCH cursor_2
INTO percentage2;
CLOSE cursor_2;

OPEN cursor_3;
FETCH cursor_3
INTO percentage3;
CLOSE cursor_3;
SET sumV = percentage1*0.01 + percentage2*0.02 + percentage1*0.03;

SELECT sumV;
END

ожидаемый результат: сумма 1% за первые 10 дней, 2% за следующие 10 дней, 3% за остальные дни месяца

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Вместо ненужного вызова курсора вы можете использовать select into. Так как курсор используется для выборки строка за строкой, но в вашем случае это приводит только один раз.

CREATE PROCEDURE monthly_sum (IN cardId INT(36), IN monthN INT, OUT sumV float)
BEGIN

DECLARE percentage1, percentage2, percentage3 float default 0;

SELECT SUM(purchased.amountPurchased) INTO percentage1
FROM purchased
WHERE MONTH(purchased.dateUsed) = monthN 
AND purchased.purchasedCardId = cardId 
AND DAY(purchased.dateUsed) <=10;

SELECT SUM(purchased.amountPurchased) INTO percentage2
FROM purchased
WHERE MONTH(purchased.dateUsed)  = monthN 
AND purchased.purchasedCardId = cardId 
AND DAY(purchased.dateUsed) <=20 AND DAY(purchased.dateUsed) >10;

SELECT SUM(purchased.amountPurchased) INTO percentage3
FROM purchased
WHERE MONTH(purchased.dateUsed) = monthN 
AND purchased.purchasedCardId = cardId 
AND DAY(purchased.dateUsed) >20;

SET sumV = percentage1*0.01 + percentage2*0.02 + percentage1*0.03; # I think percentage3 to be added instead of percentage1
END
0 голосов
/ 08 января 2019

я добавил DECLARE процент1, процент2, процент3 по умолчанию с плавающей запятой 0; в начале, как karmens89 прокомментируйте меня, и это сработало

...