Snowflakeストアドプロシージャ入門|SQLとJavaScript版の使い方

Snowflakeストアドプロシージャ入門|SQLとJavaScript版の使い方 Snowflake

ストアドプロシージャって何だろう?

こんにちは!今回はSnowflakeのストアドプロシージャについてやさしく解説します。ストアドプロシージャとは、ひとことで言えば「SQLやスクリプトをひとまとめにして、関数のように呼び出せる仕組み」のこと。複数のSQLをループや条件分岐と組み合わせて実行できるので、毎日の集計バッチや、テーブルのメンテナンス処理などをSnowflakeの中で完結させることができます。

「VIEWでもいいんじゃない?」と思うかもしれませんが、VIEWは”検索結果を返すだけ”。一方ストアドプロシージャは INSERTやUPDATE、IF文、ループ処理まで書けるのが大きな違いです。Snowflakeビューとマテリアライズドビューの違いと合わせて押さえておくと、使い分けがすっきり整理できますよ。SQLやスクリプトを関数のように呼び出せるSnowflakeストアドプロシージャの仕組みを表す解説図

SnowflakeのストアドプロシージャはSQLとJavaScriptで書ける

Snowflakeのストアドプロシージャは複数の言語に対応していますが、初心者がまず触るなら次の2つです。

  • Snowflake Scripting (SQL版): 普段のSQLの延長で書ける。BEGIN〜END、IF、LOOP、カーソルなどを使える。
  • JavaScript版: JavaScriptのコードからSQLを実行できる。複雑な条件分岐や文字列加工が得意。

どちらもCREATE PROCEDUREで作成し、CALL文で呼び出します。

SQL版(Snowflake Scripting)の例

まずはSQLだけで書ける一番シンプルな書き方から。指定した日数より古い注文を削除するプロシージャです。

CREATE OR REPLACE PROCEDURE delete_old_orders(days_old INT)
RETURNS STRING
LANGUAGE SQL
AS
$$
DECLARE
  deleted_count INT;
BEGIN
  DELETE FROM orders
  WHERE order_date < DATEADD(day, -:days_old, CURRENT_DATE());

  deleted_count := SQLROWCOUNT;
  RETURN deleted_count || ' 件の古い注文を削除しました';
END;
$$;

-- 呼び出し
CALL delete_old_orders(90);

ポイントは $$ ... $$ でコードブロックを囲むこと、そして引数は:days_oldのようにコロン付きで参照することです。SQLROWCOUNTで直前のSQLが影響した行数も取れて便利!

JavaScript版の例

もう少し柔軟にロジックを書きたいときはJavaScript版の出番。snowflake.execute()でSQLを実行できます。

CREATE OR REPLACE PROCEDURE archive_table(table_name STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
  var sql = `CREATE TABLE ${TABLE_NAME}_archive AS SELECT * FROM ${TABLE_NAME}`;
  try {
    snowflake.execute({ sqlText: sql });
    return TABLE_NAME + " のアーカイブが完了しました";
  } catch (err) {
    return "エラー: " + err.message;
  }
$$;

CALL archive_table('orders');

JavaScript版では引数名を大文字で参照する点に注意。テーブル名を動的に組み立てたいときに重宝します。

JavaScriptで記述したSnowflakeストアドプロシージャによるテーブルアーカイブ処理の実行フロー図

よくあるユースケースと注意点

ストアドプロシージャは、こんな場面で大活躍します。

  • 毎日のETLバッチ(COPY INTOでロードした後の集計処理など)
  • テーブルのアーカイブ・削除といった定期メンテナンス
  • 条件によってSQLを切り替える動的処理

注意したいのは、ストアドプロシージャは呼び出し元のウェアハウスでクレジットを消費すること。ウェアハウスのサイズ選びは大切です。また、自動更新の用途なら動的テーブルのほうがシンプルに済むこともあるので、目的に合わせて選びましょう。

まとめ

Snowflakeのストアドプロシージャは、SQL版で読みやすく書くか、JavaScript版で柔軟に書くかを選べる便利な機能です。まずはSQL版で簡単な集計や削除処理を書いてみて、慣れてきたらJavaScript版で動的SQLに挑戦するのがおすすめ。タスク(TASK)と組み合わせれば、毎日決まった時刻に自動実行することもできますよ!

参考リンク

関連記事