Reputation: 27
I am getting error as cursor is already open, and if i fix an error, my loop executes infinite times
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 ;
Upvotes: 1
Views: 582
Reputation: 49373
You open the cursor uin the loop do it before that.
I also changed the code to include a finished Option, so that the loop don't run into NULLs
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 ;
Upvotes: 1