Невозможно получить ожидаемый результат в хранимой процедуре вложенного курсора - PullRequest
1 голос
/ 12 апреля 2019

У меня есть набор данных с именем таблицы 'Closing_balance_child', как указано

enter image description here

Здесь я хочу получить AccountID, где CurrBal не равно OpeningBalance следующего года YearMasterId.

В качестве примера, давайте проверим первые 2 строки.

AccountID - 2060 , CompanyID - 1, YearMasterID = 2
AccountID - 2060 , CompanyID - 1, YearMasterID = 3

OpeningBalance второго ряда не совпадает с CurrBal первого.

Таким образом, ожидаемый результат составляет 2060,2061

Вот что я пытаюсь сделать

DELIMITER $$

DROP PROCEDURE IF EXISTS `curdemo11` $$

CREATE PROCEDURE `curdemo11`(OUT res VARCHAR(100))

BEGIN
DECLARE finished ,done BOOLEAN DEFAULT FALSE;
DECLARE a,i INT;
DECLARE accountID,companyID,yearMasterID INT;
DECLARE currClosing,curreOpening,previousBal DOUBLE(10,4);

DECLARE cur1 CURSOR FOR SELECT AccountID FROM (SELECT ID,AccountID,CompanyID,YearMasterID,CurrBal,OpeningBalance FROM 
`Closing_balance_child`
WHERE CurrBal != '0.0000' AND OpeningBalance != '0.0000'
GROUP BY AccountID,CompanyID,YearMasterID) AS t
GROUP BY AccountID
HAVING COUNT(AccountID) > 1 LIMIT 2;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;

OPEN cur1;

cur1_loop : LOOP

FETCH FROM cur1 INTO a ;

        IF finished THEN
        CLOSE cur1;
        LEAVE cur1_loop;
        END IF;

    BLOCK2: BEGIN

    DECLARE cur2 CURSOR FOR SELECT AccountID,CompanyID,YearMasterID,CurrBal,OpeningBalance FROM 
    `Closing_balance_child`
    WHERE AccountID = a;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur2;

    cur2_loop1 : LOOP

    FETCH FROM cur2 INTO accountID,companyID,yearMasterID,currClosing,curreOpening;

    SET previousBal = currClosing;
    SET i=0;

    IF finished THEN
            SET finished = FALSE;
            CLOSE cur2;
            LEAVE cur2_loop1;
        END IF; 

    SET res = a;

    IF (previousBal != curreOpening AND i != 0) THEN
    SET res = a;
    END IF;

        SET i=i+1;
    END LOOP cur2_loop1;
    END BLOCK2;

END LOOP cur1_loop;

END $$

DELIMITER ;

CALL curdemo11(@res); SELECT @res;

Помощь будет высоко ценится

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