我正在尝试动态访问表名称,并且有很多表,但它仅处理第一个表并且循环中断。知道我可能做错了什么
PROCEDURE IF EXISTS pmms.TdevidendPaymentOnSavings;
DELIMITER //
CREATE PROCEDURE TdevidendPaymentOnSavings() READS SQL DATA BEGIN
DECLARE accountNumber VARCHAR(30);DECLARE tableName VARCHAR(30);DECLARE
theAccountDate1 DATE;
DECLARE anyDateInYear DATE;DECLARE rateUsed INTEGER;DECLARE lastDate
DATE;
DECLARE ledgerBalance1 INTEGER;DECLARE amountComputed INTEGER;DECLARE
monthlySummations INTEGER;
DECLARE monthlyTotals INTEGER DEFAULT 0; DECLARE l_done INTEGER;DECLARE
finalTotals INTEGER DEFAULT 0;
DECLARE forSelectingAccountNumbers CURSOR FOR SELECT account_number
FROM
pmms.account_created_store WHERE account_number LIKE '05502%10';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_done=1;
SET l_done=0;
SELECT SavingsStartDate,SavingsRateUsed INTO anyDateInYear,rateUsed from
SavingsSharesComputationParameters;
OPEN forSelectingAccountNumbers;
accounts_loop: LOOP
FETCH forSelectingAccountNumbers into accountNumber;
IF l_done=1 THEN
LEAVE accounts_loop;
END IF;
SET tableName=CONCAT('bsanca',accountNumber);
CALL accountNma(accountNumber,@accountName);
SELECT tableName,accountNumber;
SET @sql_text1 = concat('SELECT ledger_balance INTO @ledgerBalance from
',tableName,' WHERE trn_date=@theAccountDate ORDER BY trn_id DESC LIMIT
1');
SELECT @sql_text1;
SELECT @ledgerBalance ;SELECT @theAccountDate;
PREPARE stmt1 FROM @sql_text1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END LOOP accounts_loop;
SET l_done=0;
CLOSE forSelectingAccountNumbers;
END//
DELIMITER ;
我已经检查了无数次,但似乎当我正确删除准备好的语句和循环时,否则我似乎没有发现问题。
请帮忙了解准备好的语句是否不能在循环中工作 在 mysql 程序中。
最佳答案
这两行颠倒过来。
END LOOP accounts_loop;
SET l_done=0;
您需要在END LOOP
之前将l_done
重置为FALSE
(或0) - 因为SELECT
查询之后 FETCH
可以(不一定将 - 但可以)还会触发 CONTINUE HANDLER
将其设置为 TRUE
(1) 给出游标已耗尽的错误指示。
关于mysql - 在循环中使用 mysql 准备好的语句在执行第一个循环/循环后会中断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063644/