ストアドプロシージャの概要¶
ストアドプロシージャを記述して、 SQL を実行する手続き型コードでシステムを拡張できます。ストアドプロシージャでは、プログラムによる構成を使用して、分岐とループを実行できます。ストアドプロシージャを作成すると、何度でも再利用できます。
プロシージャのロジック(そのハンドラー)を、 サポートされている言語 のいずれかで記述します。ハンドラーを作成したら、 CREATE PROCEDURE コマンドで プロシージャを作成 し、 CALL ステートメントで プロシージャを呼び出します。
ストアドプロシージャから、単一の値または(ハンドラー言語でサポートされている)表形式のデータを返すことができます。サポートされている戻り値の型の詳細については、 CREATE PROCEDURE をご覧ください。
注釈
匿名プロシージャの作成と呼び出しの両方を実行するには、 CALL (匿名プロシージャの場合) を使用します。匿名プロシージャの作成と呼び出しには、 CREATE PROCEDURE スキーマ権限を持つロールは必要ありません。
注釈
ストアドプロシージャは UDF に似ていますが、この2つは重要な点で異なります。詳細については、 ストアドプロシージャとユーザー定義関数のどちらを記述するかの選択 をご参照ください。
このトピックの内容:
ストアドプロシージャとは¶
ストアドプロシージャには、記述したロジックが含まれているため、 SQL から呼び出すことができます。通常、ストアドプロシージャのロジックは、 SQL ステートメントを実行することによってデータベース操作を実行します。
ストアドプロシージャを使用すると、次も実行できます。
SQL ステートメントを動的に作成して実行する。
プロシージャを実行するロールの権限ではなく、プロシージャを所有するロールの権限でコードを実行する。
これによりストアドプロシージャの所有者は、別の方法では指定された操作を実行できなかったユーザーに、実行する権限を委任できます。ただし、これらの所有者の権利のストアドプロシージャには制限があります。
複数の SQL ステートメントを必要とし、頻繁に実行されるタスクを自動化するために、ストアドプロシージャを使用することができます。たとえば、指定した日付より古いデータを削除して、データベースを「クリーンアップ」するとします。複数の DELETE ステートメントを記述できます。各ステートメントは特定のテーブルからデータを削除します。これらすべてのステートメントを単一のストアドプロシージャに入れて、カットオフ日を指定するパラメーターを渡すことができます。その後、プロシージャを呼び出すだけでデータベースをクリーンアップできます。データベースが変更されたら、プロシージャを更新して追加のテーブルをクリーンアップできます。クリーンアップコマンドを使用するユーザーが複数いる場合、すべてのテーブル名を覚えて各テーブルを個別にクリーンアップするのではなく、プロシージャ1つを呼び出すことができます。
ストアドプロシージャの例¶
次の例にあるコードは、 run
というPythonハンドラーを使用して myproc
というストアドプロシージャを作成します。
create or replace procedure myproc(from_table string, to_table string, count int)
returns string
language python
runtime_version = '3.8'
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"
$$;
次の例にあるコードは、ストアドプロシージャ myproc
を呼び出します。
CALL myproc('table_a', 'table_b', 5);
サポートされている言語¶
プロシージャーのハンドラー(そのロジック)は、いくつかのプログラミング言語のいずれかで記述します。各言語では、言語とそのランタイム環境の制約内でデータを操作できます。ハンドラー言語に関係なく、 SQL を使用して同じ方法でプロシージャー自体を作成し、ハンドラーとハンドラー言語を指定します。
次の言語のいずれかでハンドラーを記述できます。
言語 |
開発者ガイド |
---|---|
Java(Snowpark API を使用) |
|
JavaScript |
|
Python(Snowpark API を使用) |
|
Scala(Snowpark API を使用) |
|
Snowflakeスクリプト(SQL) |
言語の選択¶
プロシージャーのハンドラー(そのロジック)は、いくつかのプログラミング言語のいずれかで記述します。各言語では、言語とそのランタイム環境の制約内でデータを操作できます。
次の場合は、特定の言語を選択できます。
その言語のコードがすでにある。
たとえば、ハンドラーとして機能するJavaメソッドがすでにあり、メソッドのオブジェクトが.jarファイルにある場合は、.jarをステージにコピーし、ハンドラーをクラスおよびメソッドとして指定してから、Javaを言語として指定します。
選択する言語には、他の言語にはない機能がある。
選択する言語には、必要な処理を実行するために役立つライブラリがある。
言語を選択するときは、サポートされているハンドラーの場所も考慮してください。すべての言語がステージ上のハンドラーの参照をサポートしているわけではありません(ハンドラーコードはインラインにする必要があります)。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
言語 |
ハンドラーの場所 |
---|---|
Java |
インラインまたはステージング |
JavaScript |
インライン |
Python |
インラインまたはステージング |
Scala |
インラインまたはステージング |
Snowflakeスクリプト |
インライン |
開発者ガイド¶
ガイドラインと制約¶
- ヒント:
ストアドプロシージャの記述に関するヒントについては、 ストアドプロシージャの使用 をご参照ください。
- Snowflakeの制約:
Snowflakeの制約内で開発することにより、Snowflake環境内での安定性を確保できます。詳細については、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください。
- 命名:
他のプロシージャとの衝突を避ける方法でプロシージャに名前を付けるようにしてください。詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。
- 引数:
ストアドプロシージャの引数を指定し、どの引数がオプションであるかを示します。詳細については、 UDFs およびストアドプロシージャの引数の定義 をご参照ください。
- データ型マッピング:
ハンドラー言語ごとに、言語のデータ型と、引数および戻り値に使用される SQL 型との間に個別のマッピングのセットがあります。各言語のマッピングの詳細については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。
ハンドラーの記述¶
- ハンドラー言語:
ハンドラーの記述に関する言語固有のコンテンツについては、 サポートされている言語 をご参照ください。
- 外部ネットワークアクセス:
外部ネットワークアクセス で外部ネットワークロケーションにアクセスできます。Snowflakeの外部にある特定のネットワークロケーションへのセキュアアクセスを作成して、ハンドラーコード内からそのアクセスを使用することができます。
- ログおよびトレース:
ログメッセージやトレースイベントをキャプチャ し、後でクエリできるデータベースにデータを保存すると、コードのアクティビティを記録できます。
セキュリティ¶
呼び出し元の権限または所有者の権限でストアドプロシージャを実行することを選択したかどうかは、ストアドプロシージャがアクセスできる情報と、実行できるタスクに影響を与える可能性があります。詳細については、 Understanding Caller's Rights and Owner's Rights Stored Procedures をご参照ください。
ストアドプロシージャは、特定のセキュリティ上の問題をユーザー定義関数(UDFs)と共有しています。詳細については、次をご参照ください。
UDFs とプロシージャのセキュリティプラクティス で説明されているベストプラクティスに従うと、プロシージャのハンドラーコードを安全に実行することができます。
機密情報は、アクセスしてはならないユーザーから隠されていることを確認してください。詳細については、 セキュア UDFs とストアドプロシージャの使用による機密情報の保護 をご参照ください
ハンドラーコードの展開¶
プロシージャを作成するとき、プロシージャのロジックを実装するハンドラーを、 CREATE PROCEDURE ステートメントとインラインのコードとして、またはパッケージ化されてステージにコピーされたコンパイル済みコードなど、ステートメントの外部のコードとして指定できます。
詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
プロシージャの作成と呼び出し¶
プロシージャを作成して呼び出すには、 SQL を使用します。
ハンドラーコードを記述後、プロシージャのハンドラーを指定して CREATE PROCEDURE ステートメントを実行することにより、ストアドプロシージャを作成できます。詳細については、 ストアドプロシージャの作成 をご参照ください。
プロシージャを呼び出すには、プロシージャを指定する SQL CALL ステートメントを実行します。詳細については、 ストアドプロシージャの呼び出し をご参照ください。
1回だけ実行されて破棄される仮プロシージャを作成するには、 WITH...CALL を使用します。詳細については、 CALL (匿名プロシージャの場合) をご参照ください。