繰返し処理でテーブルに何度もレコードを挿入する場合等に使います。

例えば、日別でデータ集計する処理を作った場合、過去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;
おすすめの記事