52600 レコードのストアド プロシージャで作成された一時テーブルがあります。一時テーブルを反復処理し、各行の列を更新したいと考えていました。
ここではcursors
、一時テーブル用に2つ、3行あるtable2などの他のテーブル用に2つあり、一時テーブルから1行を取得し、table2を反復して比較する必要があります。
このプロセスには約 500 秒の時間がかかりますが、stored procedure
カーソルとループを使用して行うのが良いですか、それともコードで行うのが良いですか?
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_repaymentDelay`()
BEGIN
drop table if exists loan_repayed_temp;
create temporary table loan_repayed_temp ( l_id int primary key, loan_Id int, installmentNo int,date_Diff int,interval_id int default 0);
insert into loan_repayed_temp (l_id,loan_Id,installmentNo,date_Diff)
select lrs.id ,lrs.loan_profile_id ,lrs.installment_number , datediff(curdate(), lrs.estimated_payment_date) from
loanTable lp inner join loanrepaymentschedule lrs on lp.id = lrs.loan_profile_id and lp.state = 'REPAYMENT_IN_PROGRESS'
left join repayments r on lrs.loan_profile_id = r.loan_profile_id and r.repayment_number = lrs.installment_number
where r.loan_profile_id is null and lrs.estimated_payment_date < NOW()
;
BEGIN
declare done int default false;
declare lid, loanId, installmentNo , dateDiff int;
declare cursor2 cursor for select id, interval_range_min, interval_range_max from delay_interval;
declare cursor1 cursor for select l_id,loan_Id, installmentNo,date_Diff from loan_repayed_temp;
declare continue handler for not found set done = true;
open cursor1;
cursor1_loop : loop
fetch cursor1 into lid, loanId, installmentNo, dateDiff;
IF done THEN
LEAVE cursor1_loop;
END IF;
-- delay interval comparision --
BEGIN
declare i , min ,max int;
declare done2 int default false;
declare continue handler for not found set done2 = true;
open cursor2;
cursor2_loop: loop
fetch cursor2 into i, min, max;
IF done2 THEN
LEAVE cursor2_loop;
end IF;
if dateDiff >= min and dateDiff <= max then
-- insert into datedemo values(dateDiff,loanId,i);
update loan_repayed_temp set interval_id = i where l_id = lid;
leave cursor2_loop;
end if;
end loop cursor2_loop;
close cursor2;
END;
-- --
end loop cursor1_loop;
close cursor1;
END;
drop table loan_repayed_temp;
END