MySQL存储过程更新帐户状态错误代码:1329

MySQL存储过程更新帐户状态错误代码:1329,mysql,stored-procedures,error-code,Mysql,Stored Procedures,Error Code,在这种情况下,我希望遍历schedPayments表,该表在client表中存储与客户机对应的付款计划。client表还包含一个status列,其中0表示过期,1表示当前。如果客户端表中的余额大于schedPayments表中的假定余额,并且今天的日期晚于计划付款的日期,则客户端表中的状态列应设置为0 我可能对我的解决方案完全不了解,但我不断得到错误代码:1329。无数据-获取、选择或处理的行数为零。MySQL工作台缺少一些我希望它具备的主要调试功能。文档也没有完全涵盖在这种情况下我需要什么 C

在这种情况下,我希望遍历schedPayments表,该表在client表中存储与客户机对应的付款计划。client表还包含一个status列,其中0表示过期,1表示当前。如果客户端表中的余额大于schedPayments表中的假定余额,并且今天的日期晚于计划付款的日期,则客户端表中的状态列应设置为0

我可能对我的解决方案完全不了解,但我不断得到错误代码:1329。无数据-获取、选择或处理的行数为零。MySQL工作台缺少一些我希望它具备的主要调试功能。文档也没有完全涵盖在这种情况下我需要什么

CREATE PROCEDURE `project`.`status_update` ()
BEGIN  
DECLARE balance DECIMAL(20) DEFAULT 0;
DECLARE cID INT(10) DEFAULT 0;
DECLARE currentID INT(10) DEFAULT 0;
DECLARE supposedBal DECIMAL(20) DEFAULT 0;
DECLARE payDate DATE;
DECLARE cur1 CURSOR FOR SELECT ClientID,SupposedBalance,Date FROM project.schedpayments;

OPEN cur1;

status_loop: LOOP
    FETCH cur1 INTO cID, supposedBal, payDate;
    BLOCK2: BEGIN 
        DECLARE cur2 CURSOR FOR SELECT balance FROM project.client WHERE ID=cID;
        OPEN cur2;  
        FETCH cur2 INTO balance;
        IF currentID > cID THEN
            SET currentID = cID;
            IF (CURDATE() > payDate) AND (supposedBal < balance) THEN
                UPDATE feeagree SET Status=0 WHERE ID=cID;
            END IF;
            CLOSE Cur2;

        END IF;
    END BLOCK2;

END LOOP;
CLOSE cur1;
END $$
您可以看到我是如何将整个过程封装在一个块中的,这只会导致编译器认为第一个块以END BLOCK2结束;这导致了错误代码1325。光标已打开


我肯定是使这比必要的复杂,所以任何帮助将不胜感激。我学习这些东西的唯一方法是火试,今天非常热。

似乎你不需要所有的游标,你只需要一个更新语句就可以实现你的目标

如果看不到表结构和示例数据,就很难做到精确,但是SP的更简洁版本可能是这样的

CREATE PROCEDURE status_update()
  UPDATE feeagree 
     SET Status = 0 
   WHERE ID IN
  (
     SELECT p.cID
       FROM schedpayments p JOIN client c
         ON p.cID = p.ID
      WHERE p.Date < CURDATE() 
        AND p.SupposedBalance < c.balance
      GROUP BY p.cID
  );

如果内部块中的任何内容导致其设置为TRUE,则最后的SET DONE=false将重置DONE

您能否发布两个表的一些示例数据以及与该示例数据相关的预期结果?我相信你不需要光标。
...

DECLARE done TINYINT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = true;
OPEN cur1;

status_loop: LOOP
    FETCH cur1 INTO cID, supposedBal, payDate;
    IF DONE = true THEN LEAVE status_loop; END IF;

...

SET DONE = false;
END LOOP;