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

ストアドプロシージャを記述して、 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"
$$;
Copy

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

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

サポートされている言語

プロシージャーのハンドラー(そのロジック)は、いくつかのプログラミング言語のいずれかで記述します。各言語では、言語とそのランタイム環境の制約内でデータを操作できます。ハンドラー言語に関係なく、 SQL を使用して同じ方法でプロシージャー自体を作成し、ハンドラーとハンドラー言語を指定します。

次の言語のいずれかでハンドラーを記述できます。

言語

開発者ガイド

Java(Snowpark API を使用)

Javaでのストアドプロシージャの記述

JavaScript

JavaScript でのストアドプロシージャの記述

Python(Snowpark API を使用)

Pythonでのストアドプロシージャの記述

Scala(Snowpark API を使用)

Scalaでのストアドプロシージャの記述

Snowflakeスクリプト(SQL)

Snowflakeスクリプトでのストアドプロシージャの記述

言語の選択

プロシージャーのハンドラー(そのロジック)は、いくつかのプログラミング言語のいずれかで記述します。各言語では、言語とそのランタイム環境の制約内でデータを操作できます。

次の場合は、特定の言語を選択できます。

  • その言語のコードがすでにある。

    たとえば、ハンドラーとして機能する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)と共有しています。詳細については、次をご参照ください。

ハンドラーコードの展開

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

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

プロシージャの作成と呼び出し

プロシージャを作成して呼び出すには、 SQL を使用します。

  • ハンドラーコードを記述後、プロシージャのハンドラーを指定して CREATE PROCEDURE ステートメントを実行することにより、ストアドプロシージャを作成できます。詳細については、 ストアドプロシージャの作成 をご参照ください。

  • プロシージャを呼び出すには、プロシージャを指定する SQL CALL ステートメントを実行します。詳細については、 ストアドプロシージャの呼び出し をご参照ください。

  • 1回だけ実行されて破棄される仮プロシージャを作成するには、 WITH...CALL を使用します。詳細については、 CALL (匿名プロシージャの場合) をご参照ください。