ストアドプロシージャって何だろう?
こんにちは!今回はSnowflakeのストアドプロシージャについてやさしく解説します。ストアドプロシージャとは、ひとことで言えば「SQLやスクリプトをひとまとめにして、関数のように呼び出せる仕組み」のこと。複数のSQLをループや条件分岐と組み合わせて実行できるので、毎日の集計バッチや、テーブルのメンテナンス処理などをSnowflakeの中で完結させることができます。
「VIEWでもいいんじゃない?」と思うかもしれませんが、VIEWは”検索結果を返すだけ”。一方ストアドプロシージャは INSERTやUPDATE、IF文、ループ処理まで書けるのが大きな違いです。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版では引数名を大文字で参照する点に注意。テーブル名を動的に組み立てたいときに重宝します。

よくあるユースケースと注意点
ストアドプロシージャは、こんな場面で大活躍します。
- 毎日のETLバッチ(COPY INTOでロードした後の集計処理など)
- テーブルのアーカイブ・削除といった定期メンテナンス
- 条件によってSQLを切り替える動的処理
注意したいのは、ストアドプロシージャは呼び出し元のウェアハウスでクレジットを消費すること。ウェアハウスのサイズ選びは大切です。また、自動更新の用途なら動的テーブルのほうがシンプルに済むこともあるので、目的に合わせて選びましょう。
まとめ
Snowflakeのストアドプロシージャは、SQL版で読みやすく書くか、JavaScript版で柔軟に書くかを選べる便利な機能です。まずはSQL版で簡単な集計や削除処理を書いてみて、慣れてきたらJavaScript版で動的SQLに挑戦するのがおすすめ。タスク(TASK)と組み合わせれば、毎日決まった時刻に自動実行することもできますよ!
参考リンク
関連記事
- Snowflakeビューとマテリアライズドビューの違い|初心者向け使い分けガイド – VIEWとプロシージャの役割の違いを整理できます
- Snowflake動的テーブル入門|自動更新されるテーブルの仕組み – 自動化したいなら動的テーブルも選択肢に
- Snowflake COPY INTOでファイルからテーブルへデータ投入する方法 – プロシージャと組み合わせるとETLが楽になります
- Snowflakeウェアハウスとは?サイズと使い分けを初心者向けに解説 – プロシージャ実行時のクレジット消費を理解するために
- Snowflake QUALIFY句の使い方|ウィンドウ関数の絞り込みが超簡単に – プロシージャ内のSQLでも活用できる便利機能

