ストアドプロシージャの概要¶
ストアドプロシージャを記述して、 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を言語として指定します。
選択する言語には、他の言語にはない機能がある。
選択する言語には、必要な処理を実行するために役立つライブラリがある。
言語を選択するときは、次も考慮してください。
サポートされているハンドラーの場所。 すべての言語がステージ上のハンドラーの参照をサポートしているわけではありません(ハンドラーコードはインラインである必要があります)。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
ハンドラーが共有可能な UDF になるかどうか。 共有可能な UDF は、Snowflakeの Secure Data Sharing 機能で使用できます。
言語 |
ハンドラーの場所 |
共有可能 |
---|---|---|
Java |
インラインまたはステージング |
不可 1 |
JavaScript |
インライン |
可 |
Python |
インラインまたはステージング |
不可 2 |
Scala |
インラインまたはステージング |
不可 2 |
Snowflakeスクリプト |
インライン |
不可 2 |
開発者ガイド¶
ガイドラインと制約¶
ストアドプロシージャの記述に関するヒントについては、 ストアドプロシージャの使用 をご参照ください。
Snowflakeの制約内で開発することにより、Snowflake環境内での安定性を確保できます。詳細については、 Snowflakeが課す制約内でのハンドラーの設計 をご参照ください
他のプロシージャとの衝突を避ける方法でプロシージャに名前を付けるようにしてください。詳細については、 プロシージャおよび UDFs の命名規則 をご参照ください
セキュリティ¶
呼び出し元の権限または所有者の権限でストアドプロシージャを実行することを選択したかどうかは、ストアドプロシージャがアクセスできる情報と、実行できるタスクに影響を与える可能性があります。詳細については、 呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。
ストアドプロシージャは、特定のセキュリティ上の問題をユーザー定義関数(UDFs)と共有しています。詳細については、次をご参照ください。
UDFs とプロシージャのセキュリティプラクティス で説明されているベストプラクティスに従うと、プロシージャのハンドラーコードを安全に実行することができます。
機密情報は、アクセスしてはならないユーザーから隠されていることを確認してください。詳細については、 セキュア UDFs とストアドプロシージャの使用による機密情報の保護 をご参照ください
ハンドラーコードの展開¶
プロシージャを作成するとき、プロシージャのロジックを実装するハンドラーを、 CREATE PROCEDURE ステートメントとインラインのコードとして、またはパッケージ化されてステージにコピーされたコンパイル済みコードなど、ステートメントの外部のコードとして指定できます。
詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
データ型マッピング¶
ハンドラー言語ごとに、言語のデータ型と、引数および戻り値に使用される SQL 型との間に個別のマッピングのセットがあります。各言語のマッピングの詳細については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。
プロシージャの作成と呼び出し¶
プロシージャを作成して呼び出すには、 SQL を使用します。
ハンドラーコードを記述後、プロシージャのハンドラーを指定して CREATE PROCEDURE ステートメントを実行することにより、ストアドプロシージャを作成できます。詳細については、 ストアドプロシージャの作成 をご参照ください。
プロシージャを呼び出すには、プロシージャを指定する SQL CALL ステートメントを実行します。詳細については、 ストアドプロシージャの呼び出し をご参照ください。
1回だけ実行されて破棄される仮プロシージャを作成するには、 WITH...CALL を使用します。詳細については、 CALL (匿名プロシージャの場合) をご参照ください。