我有一种情况,我想遍历“ schedPayments”表,该表在“ client”表中存储与客户对应的付款时间表。客户表中还包含一个“状态”列,当前列的“过去到期”为0,“当前”为1。如果客户表中的余额大于schedPayments表中的假定余额,并且今天的日期晚于计划付款的日期,则客户表中的status列应设置为0。

我的解决方案可能会完全搁浅,但我一直收到错误代码:1329。无数据-提取,选择或处理了零行。 MySQL Workbench缺少一些我希望它具有的主要调试功能。在这种情况下,文档也没有涵盖我所需要的。

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。游标已打开。

我肯定会使事情变得不必要的复杂,因此,我们将不胜感激。我学习这些东西的唯一方法是通过火拼,今天它非常热。

最佳答案

似乎您并不需要所有这些游标,并且可以通过一个UPDATE语句实现目标。

不查看表结构和样本数据就很难精确,但是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
  );

关于mysql - MySQL存储过程帐户更新状态错误代码:1329,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17095817/

10-14 13:59
查看更多