drop procedure if exists stock_io_sync; DELIMITER // create procedure stock_io_sync( _sdate varchar(8), _edate varchar(8) ) SQL SECURITY INVOKER BEGIN Declare _line_id int; Declare _not_found boolean; Declare _line_cur_sales cursor for select sabd.id from dbr_sorder as sohd inner join dbr_sorder_bd as sobd on sohd.id = sobd.sorder_id inner join dbr_sales_bd as sabd on sobd.id = sabd.sorder_bd_id inner join dbr_sales as sahd on sahd.id = sabd.sales_id where sales_date between _sdate and _edate order by sales_date asc, sabd.id asc; Declare _line_cur_purch cursor for select pubd.id from dbr_porder as pohd inner join dbr_porder_bd as pobd on pohd.id = pobd.porder_id inner join dbr_purch_bd as pubd on pobd.id = pubd.porder_bd_id inner join dbr_purch as puhd on puhd.id = pubd.purch_id where purch_date between _sdate and _edate order by purch_date asc, pubd.id asc; Declare _line_cur_genio cursor for select gnbd.id from dbr_genio as gnhd inner join dbr_genio_bd as gnbd on gnhd.id = gnbd.genio_id where genio_date between _sdate and _edate order by genio_date asc, gnbd.id asc; Declare continue handler for not found set _not_found = true; delete from dbr_stock_io where io_date between _sdate and _edate; set _not_found = false; -- 이것이 Multi cursor를 쓰는 핵심이다. open _line_cur_sales; loop_sales: loop fetch _line_cur_sales into _line_id; if _not_found then leave loop_sales; end if; call stock_io_act('sales', _line_id, 0); end loop loop_sales; close _line_cur_sales; set _not_found = false; -- 이것이 Multi cursor를 쓰는 핵심이다. open _line_cur_purch; loop_purch: loop fetch _line_cur_purch into _line_id; if _not_found then leave loop_purch; end if; call stock_io_act('purch', _line_id, 0); end loop loop_purch; close _line_cur_purch; set _not_found = false; -- 이것이 Multi cursor를 쓰는 핵심이다. open _line_cur_genio; loop_genio: loop fetch _line_cur_genio into _line_id; if _not_found then leave loop_genio; end if; call stock_io_act('genio', _line_id, 0); end loop loop_genio; close _line_cur_genio; END; // DELIMITER ;