■ はじめに
https://dk521123.hatenablog.com/entry/2022/12/11/202904
の続き。 ストアド で ループする処理を学ぶ。 今回で、大分便利に使えるようになりそう、、、
目次
【1】Snowflakeのストアドのループ操作 1)FOR 2)WHILE 3)REPEAT 4)LOOP 【2】サンプル 例1:FOR文でのループ 例2:WHILE文でのループ(日付でのループ) 例3:LOOP文でのループ
【1】Snowflakeのストアドのループ操作
https://docs.snowflake.com/ja/developer-guide/snowflake-scripting/loops.html
より抜粋 ~~~~~~~~~ Snowflakeスクリプトは、次のタイプのループをサポートしています。 * FOR * WHILE * REPEAT * LOOP ~~~~~~~~~ * 使い分けについては、正直好みだと思うが、ざっくり以下な感じ? + 無限ループ的にループさせたい(終了条件でBreak) : LOOP + FOR/WHILE(REPEAT) は、Javaとか同じで使い方で好みかと、、、
1)FOR
https://docs.snowflake.com/ja/developer-guide/snowflake-scripting/loops.html#for-loop
-- 指定された回数、または結果セットの各行に対して一連のステップを繰り返す FOR <counter_variable> IN [ REVERSE ] <start> TO <end> { DO | LOOP } <statement>; [ <statement>; ... ] END { FOR | LOOP } [ <label> ] ;
2)WHILE
https://docs.snowflake.com/ja/developer-guide/snowflake-scripting/loops.html#while-loop
-- WHILE ループは、条件がtrueの 間、反復 WHILE ( <condition> ) { DO | LOOP } <statement>; [ <statement>; ... ] END { WHILE | LOOP } [ <label> ] ;
3)REPEAT
-- 条件がtrueに なるまで 反復 REPEAT <statement>; [ <statement>; ... ] UNTIL ( <condition> ) END REPEAT [ <label> ] ;
4)LOOP
-- BREAK コマンドが実行されるまで、 LOOP ループは実行 LOOP <statement>; [ <statement>; ... ] END LOOP [ <label> ] ;
【2】サンプル
以下の「例1」「例2」で 使用している「execute immediate」について、 以下の関連記事を参照のこと。
【Snowflake】ストアド ~ EXECUTE IMMEDIATE ~
https://dk521123.hatenablog.com/entry/2022/12/17/000217
例1:FOR文でのループ
execute immediate $$ declare counter integer default 0; max_count integer default 10; begin -- FOR Loop for i in 1 to max_count do counter := counter + 1; end for; return counter; end; $$ ;
例2:WHILE文でのループ(日付でのループ)
-- デモ用テーブル create table demo_date(input_date date); -- 日付でのループ用ストアド execute immediate $$ declare start_date date default date('2022-02-28'); end_date date default date('2022-03-05'); begin let target_date := start_date; -- WHILE Loop (end_dateまでループする) while (target_date <= end_date) do insert into demo_date(input_date) values (:target_date); target_date := target_date + interval '1 days'; end while; return 'Done'; end; $$ ; -- 確認 select * from demo_date; -- <出力結果(うるう年も考慮してループ可能)> -- 2022-02-28 -- 2022-03-01 -- 2022-03-02 -- 2022-03-03 -- 2022-03-04 -- 2022-03-05 -- 後片付け drop table demo_date;
例3:LOOP文でのループ
create procedure demo_loop() returns integer language sql as $$ declare counter integer; begin counter := 0; loop counter := counter + 1; if (counter > 10) then break; end if; select :counter; end loop; return counter; end; $$ ; call demo_loop();
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
【Snowflake】ストアド ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/12/11/202904
【Snowflake】ストアド ~ 基本編 / 条件分岐 ~
https://dk521123.hatenablog.com/entry/2022/12/26/211349
【Snowflake】ストアド ~ EXECUTE IMMEDIATE ~
https://dk521123.hatenablog.com/entry/2022/12/17/000217
【Snowflake】ストアド ~ 例外 / EXCEPTION ~
https://dk521123.hatenablog.com/entry/2022/12/23/223345
【Snowflake】ストアド ~ デバッグログについて ~
https://dk521123.hatenablog.com/entry/2022/12/18/121334
Snowflake ~ 日時関連 ~
https://dk521123.hatenablog.com/entry/2022/06/17/113003
Snowflake ~ 日時関連 / 日時取得関数 ~
https://dk521123.hatenablog.com/entry/2022/09/02/092144
Snowflake ~ クエリの中断 ~
https://dk521123.hatenablog.com/entry/2022/12/09/152837
ストアド ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2010/08/06/112528
指定した日付分アンロードするSQLを生成するPythonコード
https://dk521123.hatenablog.com/entry/2023/08/09/000000