Mysql Сказал: # 1325 Курсор уже открыт - PullRequest
1 голос
/ 23 марта 2020

Я получаю ошибку, так как курсор уже открыт, и если я исправлю ошибку, мой l oop будет выполняться бесконечно много раз

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_StatementOfAccont_Closingbal_new`(IN `Ac_code` BIGINT, IN `fdate` DATE, IN `tdate` DATE, IN `opening` DOUBLE, IN `dc` VARCHAR(25), IN `drsum` DOUBLE, IN `crsum` DOUBLE)
        NO SQL
Begin

    DECLARE cur_name1 CURSOR FOR select Ac_code from ledger_master;

    BEGIN
        OPEN cur_name1;
        MAIN_LOOP: LOOP         
            FETCH cur_name1 INTO Ac_code;     
            select @opening := Op_bal from ledger_master where Ac_code=Ac_code;             
            select @dc := op_dc from ledger_master where Ac_code=Ac_code;               
            select @drsum := sum(Amount) from ledgerentry where DC='dr' and Ac_code=Ac_code and  ledgerentry.date <= @tdate;                
            select @crsum := sum(Amount) from ledgerentry where DC='cr' and Ac_code=Ac_code and  ledgerentry.date <= @tdate;
            if (@dc='cr' and @opening>0) THEN
                set @opening := 0-@opening;
            END IF;
            set @opening := ifnull( @opening,0) + ifnull(@drsum,0) - ifnull(@crsum,0);

            delete from tmp_closingbalance;

            if(@opening>0) then
                insert into tmp_closingbalance values(Ac_code,@opening,0);
            ELSEIF(@opening<0) then
                set @opening := 0-@opening;
                insert into tmp_closingbalance values(Ac_code, 0,@opening );    
            ELSEIF(@opening=0) then
                insert into tmp_closingbalance values(Ac_code,0,0);    
            end if;
        END LOOP;
        CLOSE cur_name1;
    END;

END$$
DELIMITER ;

1 Ответ

1 голос
/ 23 марта 2020

Вы открываете курсор, когда l oop делаете это до этого.

Я также изменил код для включения готового Option, чтобы l oop не сталкивался с NULL

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_StatementOfAccont_Closingbal_new`(IN `Ac_code` BIGINT, IN `fdate` DATE, IN `tdate` DATE, IN `opening` DOUBLE, IN `dc` VARCHAR(25), IN `drsum` DOUBLE, IN `crsum` DOUBLE)
        NO SQL
Begin
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE cur_name1 CURSOR FOR select Ac_code from ledger_master;

    OPEN cur_name1;
    BEGIN

        MAIN_LOOP: LOOP         
            FETCH cur_name1 INTO Ac_code; 
            IF finished = 1 THEN 
                LEAVE MAIN_LOOP;
            END IF;
            select @opening := Op_bal from ledger_master where Ac_code=Ac_code;             
            select @dc := op_dc from ledger_master where Ac_code=Ac_code;               
            select @drsum := sum(Amount) from ledgerentry where DC='dr' and Ac_code=Ac_code and  ledgerentry.date <= @tdate;                
            select @crsum := sum(Amount) from ledgerentry where DC='cr' and Ac_code=Ac_code and  ledgerentry.date <= @tdate;
            if (@dc='cr' and @opening>0) THEN
                set @opening := 0-@opening;
            END IF;
            set @opening := ifnull( @opening,0) + ifnull(@drsum,0) - ifnull(@crsum,0);

            delete from tmp_closingbalance;

            if(@opening>0) then
                insert into tmp_closingbalance values(Ac_code,@opening,0);
            ELSEIF(@opening<0) then
                set @opening := 0-@opening;
                insert into tmp_closingbalance values(Ac_code, 0,@opening );    
            ELSEIF(@opening=0) then
                insert into tmp_closingbalance values(Ac_code,0,0);    
            end if;
        END LOOP;
        CLOSE cur_name1;
    END;

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