游标或处理程序声明SQL语句(mysql)后的变量或条件声明

游标或处理程序声明SQL语句(mysql)后的变量或条件声明,mysql,sql,stored-procedures,cursor,mysql-workbench,Mysql,Sql,Stored Procedures,Cursor,Mysql Workbench,即使我尝试了很多方法,它仍然会给我这个错误(游标或处理程序声明之后的变量或条件声明) 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.da

即使我尝试了很多方法,它仍然会给我这个错误(游标或处理程序声明之后的变量或条件声明) 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
创建程序月度金额(卡内整数(36)、月内整数、月外浮动)
开始
声明游标\u 1游标用于
选择金额(已购买。已购买金额)
从购买
其中月(购买.日期使用)=月,购买.购买D=卡,日(购买.日期使用)20;
声明percentage1、percentage2、percentage3浮动默认为0;
打开光标_1;
取光标_1
分为百分比1;
关闭光标_1;
打开光标2;
取光标2
分为百分比2;
关闭光标_2;
打开光标3;
取光标_3
分为3个百分点;
关闭光标_3;
设置sumV=percentage1*0.01+percentage2*0.02+percentage1*0.03;
选择sumV;
结束

预期输出前10天的1%,后10天的2%,当月剩余天数的3%的总和

我添加了DECLARE percentage1,percentage2,percentage3浮动默认值0;开始时,就像karmens89评论我一样,它工作了

而不是不必要地调用游标,您可以使用
选择进入
。因为游标用于逐行获取数据,但在您的情况下,它只会产生一次结果

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
创建程序月度金额(卡内整数(36)、月内整数、月外浮动)
开始
声明percentage1、percentage2、percentage3浮动默认为0;
选择百分比1中的金额(已购买.已购买金额)
从购买
其中月份(购买日期使用)=月份
和已购买。purchasedCardId=cardId
第20天(购买日期和使用日期);
设置sumV=percentage1*0.01+percentage2*0.02+percentage1*0.03;#我认为应该增加百分比3,而不是百分比1
结束

您是否重置了MySQL默认分隔符。。像
分隔符//
一样,尝试在开头添加以下内容:声明percentage1、percentage2、percentage3浮动默认值0;