繰返し処理でテーブルに何度もレコードを挿入する場合等に使います。
例えば、日別でデータ集計する処理を作った場合、過去3年分同じように集計する必要がある。
といった場合に、以下のようなコードで対処可能。
### ループさせる為のプロシージャー drop procedure if exists loop_proc; create procedure loop_proc() BEGIN declare date_now date; declare date_end date; set date_end = current_date(); set date_now = date_add(date_end, interval - 7 day); ## 繰り返したい回数をここで指定する。左記では7回分の実行を行う while date_end > date_now do call loop_test(date_now); ## loop_testというプロシージャーにdate_nowという値を渡して実行する set date_now = date_add( date_now, interval 1 day ); end while; END
※2行目:プロシージャーが存在したら削除する(プロシージャーの作り直し用に書いておくと吉)
※3行目:ループ用として、プロシージャーを作成する
※6~7行目:利用する変数を事前に定義する。これがないと変数を利用できない
※9~10行目:ループの終了日をdate_endに設定、ループ開始日をdate_nowに設定する
※11&16行目:while文でのループ処理設定、上記コードでは、date_end > date_nowの条件に合致したらループを終了する
※13行目:ループさせる処理を呼び出す(date_now)と指定する事で、引数を渡す事が出来る
※15行目:date_nowを1日先に更新する
### ループして複数回呼び出す処理 drop procedure if exists loop_test; create procedure loop_test(in date_now date) ## ここでdate_nowを日付型で受取る BEGIN set @ymd = date_now; select date,count(user_id) as cnt from testtbl where date= @ymd; END
※2行目:プロシージャーが存在したら削除する(プロシージャーの作り直し用に書いておくと吉)
※3行目:ループさせたい処理のプロシージャーを作成する(in date_now date) と定義する事で、date_nowという値を受け取る事が出来る
※6行目:date_nowを受け取って@ymeに格納する
※8~10行目:user_access_spareから日別に件数を取得する
## プロシージャーを実行する CALL loop_proc;