我有一种情况,我想遍历“ 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/