注:本記事は(2022年5月18日)に公開された(What You Need to Know About Scripting in SQL with Snowflake)を翻訳して公開したものです。

Snowflakeスクリプトが一般提供されており、Snowflakeを使用したSQLでのスクリプトやストアドプロシージャの作成が可能となりました。このプロシージャ言語を利用することで、条件ステートメントやループステートメントといった構造や制御ステートメントによりSQL言語を拡張し、Snowflakeユーザー(ほとんどがSQLを経験し使用を好んでいる)によるストアドプロシージャの作成やSQLベーススクリプトの変換が容易になります。

この機能は、プレビュー段階において非常に高く評価され使用されました。Snowflakeスクリプトは簡単に使い始めることができます。以下に紹介する重要なコンセプトをご理解いただければ、すぐに使いこなしていただけると思います。

ブロックを理解する

本機能を使用すると、Snowflakeスクリプトブロック内でプロシージャコードを書けるようになります。ストアドプロシージャの定義内でブロックを使用することができるほか、ストアドプロシージャ内での使用を望まない場合は、分離された独立したSQLステートメントとして匿名ブロックを作成することも可能です。

テーブルを返す

主な新機能の1つが、Snowflakeスクリプトを使用してテーブルを返すことができる点です。このように、SnowflakeユーザーがSnowflakeスクリプトを使用してETLやデータ処理タスクを開発できるだけでなく、レポートプロシージャの開発や移行も簡素化されます。SnowflakeスクリプトはSnowflakeのSQLと密に統合されており、データシェアリングやマーケットプレイスアプリケーションの構築における使用や共有が可能です。

制御フローステートメントの機能

Snowflakeスクリプトは、「IF」や「CASE」ステートメントといった分岐構造に対応しています。

  • 「IF」は条件が合致した場合、一連のステートメントを実行します。
  • 「CASE」も「IF」と似たように機能しますが、複数条件の指定がよりシンプルです。

ループの4つの種類:FOR、WHILE、REPEAT、LOOP 

  • 「FOR」ループは一連のステップを指定された回数または結果セットにおける各行について繰り返します。カウンターベースまたはカーソルベースとすることができます。
  • 「WHILE」ループは、条件が真の場合のみ実行されます。「WHILE」条件は、ループ本文前に即時に判断され、条件が偽であった場合ループは実行されません(最初のループで生じた場合1度も実行されません)。
  • 「REPEAT」ループは条件が真となるまで繰り返されます。
  • 「LOOP」ループはコマンドが入力されるまで実行し続けます。

カーソルを利用してクエリ結果の1行ごとにループさせることも可能です。クエリの結果からデータを取得するにはカーソルを使用してください。ループ内にあるカーソルを使用して結果の複数行に対しループさせることができます。

例外の取り扱い

Snowflakeスクリプトブロック内では、エラーが生じた場合に例外を発生させ、例外処理としてコードの次の行の実行を阻止することができます。またSnowflakeスクリプトコード内で生じた例外を処理することもできます。

例外が発生した場合、Snowflakeスクリプトはハンドラーを検知しようとします。例外ハンドラーには、別の例外処理中の例外発生に備え、例外ハンドラー自体の例外ハンドラーを含むことができます。

Snowflakeスクリプトの詳細についてはSnowflakeドキュメンテーションをご覧いただき、開始にあたってはメディア上のSQLスクリプト例をご参照ください。

ボーナス:Snowflakeのデータに関するスーパーヒーローであるRajiv Guptaが、メディア上で分岐構造ループカーソル結果例外処理についてシリーズで掲載しています。