ИСПОЛЬЗОВАНИЕ подготовленного оператора mysql в цикле прерывает цикл после исключения первого цикла / цикла - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь получить динамический доступ к именам таблиц, и существует много таблиц, но он обрабатывает только первую таблицу и разрывы цикла. Любая идея, что я могу делать неправильно

 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.

1 Ответ

0 голосов
/ 06 января 2019

Эти две строки перевернуты.

END LOOP accounts_loop;

SET l_done=0;

Вам нужно сбросить l_done обратно на FALSE (или 0) до END LOOP - потому что SELECT запрашивает после может FETCH ( не обязательно будет - но может ) также вызвать CONTINUE HANDLER, чтобы установить его на TRUE (1), давая ложное указание, что курсор исчерпан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...