【Snowflake】ストアド ~ 基本編 / ループ ~

■ はじめに

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