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

例えば、日別でデータ集計する処理を作った場合、過去3年分同じように集計する必要がある。

といった場合に、以下のようなコードで対処可能。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
### ループさせる為のプロシージャー
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
### ループさせる為のプロシージャー 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
### ループさせる為のプロシージャー
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日先に更新する

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
### ループして複数回呼び出す処理
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
### ループして複数回呼び出す処理 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
### ループして複数回呼び出す処理
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から日別に件数を取得する

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
## プロシージャーを実行する
CALL loop_proc;
## プロシージャーを実行する CALL loop_proc;
## プロシージャーを実行する
CALL loop_proc;

この記事が気に入ったら『目黒で働く分析担当の作業メモ』ご支援をお願いします!

※OFUSEに飛びます


おすすめの記事