在循环中使用mysql prepared语句在执行第一个循环/循环后中断循环

xj3cbfub  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(365)

我尝试动态访问表名,有很多表,但它只处理第一个表和循环中断。你知道我会做错什么吗

  1. PROCEDURE IF EXISTS pmms.TdevidendPaymentOnSavings;
  2. DELIMITER //
  3. CREATE PROCEDURE TdevidendPaymentOnSavings() READS SQL DATA BEGIN
  4. DECLARE accountNumber VARCHAR(30);DECLARE tableName VARCHAR(30);DECLARE
  5. theAccountDate1 DATE;
  6. DECLARE anyDateInYear DATE;DECLARE rateUsed INTEGER;DECLARE lastDate
  7. DATE;
  8. DECLARE ledgerBalance1 INTEGER;DECLARE amountComputed INTEGER;DECLARE
  9. monthlySummations INTEGER;
  10. DECLARE monthlyTotals INTEGER DEFAULT 0; DECLARE l_done INTEGER;DECLARE
  11. finalTotals INTEGER DEFAULT 0;
  12. DECLARE forSelectingAccountNumbers CURSOR FOR SELECT account_number
  13. FROM
  14. pmms.account_created_store WHERE account_number LIKE '05502%10';
  15. DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_done=1;
  16. SET l_done=0;
  17. SELECT SavingsStartDate,SavingsRateUsed INTO anyDateInYear,rateUsed from
  18. SavingsSharesComputationParameters;
  19. OPEN forSelectingAccountNumbers;
  20. accounts_loop: LOOP
  21. FETCH forSelectingAccountNumbers into accountNumber;
  22. IF l_done=1 THEN
  23. LEAVE accounts_loop;
  24. END IF;
  25. SET tableName=CONCAT('bsanca',accountNumber);
  26. CALL accountNma(accountNumber,@accountName);
  27. SELECT tableName,accountNumber;
  28. SET @sql_text1 = concat('SELECT ledger_balance INTO @ledgerBalance from
  29. ',tableName,' WHERE trn_date=@theAccountDate ORDER BY trn_id DESC LIMIT
  30. 1');
  31. SELECT @sql_text1;
  32. SELECT @ledgerBalance ;SELECT @theAccountDate;
  33. PREPARE stmt1 FROM @sql_text1;
  34. EXECUTE stmt1;
  35. DEALLOCATE PREPARE stmt1;
  36. END LOOP accounts_loop;
  37. SET l_done=0;
  38. CLOSE forSelectingAccountNumbers;
  39. END//
  40. DELIMITER ;

我已经检查过无数次了,但是当我正确地删除准备好的语句和循环时,我似乎没有发现问题。
请帮助了解在mysql过程中,准备好的语句是否不能在循环中工作。

70gysomp

70gysomp1#

这两条线是相反的。

  1. END LOOP accounts_loop;
  2. SET l_done=0;

你需要重新设置 l_done 回到 FALSE (或0)之前 END LOOP --因为 SELECT 之后的查询 FETCH can(不一定是arilu will——但是can)也会触发 CONTINUE HANDLER 设置为 TRUE (1) 错误指示光标已用完。

相关问题