ストアドプロシージャの概要

ストアドプロシージャを書いて、プロシージャ コードでシステムを拡張することができます。プロシージャを使えば、分岐やループ、その他のプログラム構文を使うことができます。プロシージャは、他のコードから呼び出すことで複数回再利用することができます。

ストアドプロシージャを使うと、以下のことができます。

  • 複数のデータベース操作を頻繁に実行する必要があるタスクを自動化します。

  • データベース操作を動的に作成し、実行します。

  • プロシージャを実行するロールの権限ではなく、プロシージャを所有するロールの権限でコードを実行する。

    これによりストアドプロシージャの所有者は、別の方法では指定された操作を実行できなかったユーザーに、実行する権限を委任できます。ただし、これらの所有者の権利のストアドプロシージャには制限があります。

たとえば、指定した日付より古いデータを削除して、データベースを「クリーンアップ」するとします。コード内で削除演算子を複数回実行し、その都度特定のテーブルからデータを削除することができます。これらのステートメントを1つのストアドプロシージャにまとめ、締切日を指定するパラメーターを渡すことができます。

プロシージャが配置されたら、それを呼び出してデータベースをクリーンアップします。データベースが変更されたら、プロシージャを更新して追加のテーブルをクリーンアップできます。新しいクリーンアップコマンドを使用するユーザーが複数いる場合、すべてのテーブル名を記憶して各テーブルを個別にクリーンアップするのではなく、1つのプロシージャを呼び出すことができます。

ストアドプロシージャは UDF に似ていますが、この2つは重要な点で異なります。詳細については、 ストアドプロシージャとユーザー定義関数のどちらを記述するかの選択 をご参照ください。

プロシージャはSnowflakeを拡張する1つの方法に過ぎません。その他については、次をご参照ください。

対応言語とツール

ストアドプロシージャ(およびその他のSnowflakeエンティティ)は、作業方法に応じて複数のツールのいずれかを使用して作成および管理できます。

言語

アプローチ

サポート

SQL

Java、 JavaScript、Python、Scala、 SQL Scripting のハンドラーを使用。

Snowflakeで、Snowflakeエンティティを作成・管理する SQL コードを記述します。プロシージャのロジックを、サポートされているハンドラー言語のいずれかで記述します。

Java

JavaScript

Python

Scala

SQL スクリプト

Java、Python、またはScala

Snowpark API

クライアント上で、処理のためにSnowflakeにプッシュされる演算子のコードを記述します。

Java

Python

Scala

コマンドラインインターフェイス

Snowflake CLI

コマンドラインを使用して、 JSON オブジェクトのプロパティとしてプロパティを指定し、Snowflake エンティティを作成および管理します。

Snowflakeオブジェクトの管理

Python

Snowflake Python API

クライアント上で、Snowflakeの管理操作を実行するコードを記述します。

ストアドプロシージャの管理

REST

Snowflake REST API

RESTful エンドポイントにリクエストを行い、Snowflake エンティティを作成および管理します。

手続きを管理する

プロシージャのロジック(そのハンドラー)を、 サポートされている言語 のいずれかで記述します。ハンドラーを作成したら、 CREATE PROCEDURE コマンドで プロシージャを作成 し、 CALL ステートメントで プロシージャを呼び出します。

ストアドプロシージャから、単一の値または(ハンドラー言語でサポートされている)表形式のデータを返すことができます。サポートされている戻り値の型の詳細については、 CREATE PROCEDURE をご覧ください。

言語を選択するときは、サポートされているハンドラーの場所も考慮してください。すべての言語がステージ上のハンドラーの参照をサポートしているわけではありません(ハンドラーコードはインラインにする必要があります)。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。

言語

ハンドラーの場所

Java

インラインまたはステージング

JavaScript

インライン

Python

インラインまたはステージング

Scala

インラインまたはステージング

Snowflakeスクリプト

インライン

注釈

匿名プロシージャの作成と呼び出しの両方を実行するには、 CALL (匿名プロシージャでの場合) を使用します。匿名プロシージャの作成と呼び出しには、 CREATE PROCEDURE スキーマ権限を持つロールは必要ありません。

ストアドプロシージャの例

次の例にあるコードは、 run というPythonハンドラーを使用して myproc というストアドプロシージャを作成します。

CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.9'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
  session.table(from_table).limit(count).write.save_as_table(to_table)
  return "SUCCESS"
$$;
Copy

次の例にあるコードは、ストアドプロシージャ myproc を呼び出します。

CALL myproc('table_a', 'table_b', 5);
Copy

ガイドラインと制約

ヒント:

ストアドプロシージャの記述に関するヒントについては、 ストアドプロシージャの使用 をご参照ください。

Snowflakeの制約:

Snowflakeの制約内で開発することにより、Snowflake環境内での安定性を確保できます。詳細については、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください。

命名:

他のプロシージャとの衝突を避ける方法でプロシージャに名前を付けるようにしてください。詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。

引数:

ストアドプロシージャの引数を指定し、どの引数がオプションであるかを示します。詳細については、 UDFs およびストアドプロシージャの引数の定義 をご参照ください。

データ型マッピング:

ハンドラー言語ごとに、言語のデータ型と、引数および戻り値に使用される SQL 型との間に個別のマッピングのセットがあります。各言語のマッピングの詳細については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。

ハンドラーの記述

ハンドラー言語:

ハンドラーの記述に関する言語固有のコンテンツについては、 対応言語とツール をご参照ください。

外部ネットワークアクセス:

外部ネットワークアクセス で外部ネットワークロケーションにアクセスできます。Snowflakeの外部にある特定のネットワークロケーションへのセキュアアクセスを作成して、ハンドラーコード内からそのアクセスを使用することができます。

ログおよびトレース:

ログメッセージやトレースイベントをキャプチャ し、後でクエリできるデータベースにデータを保存すると、コードのアクティビティを記録できます。

セキュリティ

呼び出し元の権限または所有者の権限でストアドプロシージャを実行することを選択したかどうかは、ストアドプロシージャがアクセスできる情報と、実行できるタスクに影響を与える可能性があります。詳細については、 呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。

ストアドプロシージャは、特定のセキュリティ上の問題をユーザー定義関数(UDFs)と共有しています。詳細については、次をご参照ください。

ハンドラーコードのデプロイメント

プロシージャを作成するとき、プロシージャのロジックを実装するハンドラーを、 CREATE PROCEDURE ステートメントとインラインのコードとして、またはパッケージ化されてステージにコピーされたコンパイル済みコードなど、ステートメントの外部のコードとして指定できます。

詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。