【问题标题】:Variable or condition declaration after cursor or handler declaration SQL Statement (mysql)游标或处理程序声明后的变量或条件声明 SQL 语句 (mysql)
【发布时间】:2019-06-03 05:00:14
【问题描述】:

即使我尝试了很多事情,它仍然给我这个错误(游标或处理程序声明后的变量或条件声明 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

预期产出是前 10 天的 1%、接下来 10 天的 2%、当月其余天的 3% 之和

【问题讨论】:

  • 你有没有重置 MySQL 默认分隔符.. 比如DELIMITER //
  • 尝试在开头添加这个:DECLARE percent1, percent2, percent3 float default 0;

标签: mysql sql stored-procedures cursor mysql-workbench


【解决方案1】:

我添加了 DECLARE percent1, percent2, percent3 float default 0;一开始就像 karmens89 评论我,它起作用了

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-11-11
      • 2015-05-04
      • 2021-03-14
      相关资源
      最近更新 更多