ストアドプロシージャの作成

Snowflakeで利用可能ないくつかの方法のいずれかを使用して、 ストアドプロシージャ を作成できます。これらの方法については、このトピックで説明します。

プロシージャの作成

  1. Python、Java、Scalaなど、サポートされている言語のいずれかを使用して、ハンドラーとしてプロシージャロジックを記述します。

  2. ツールまたは API を選択し、作成したハンドラーでプロシージャを作成します。

    それぞれの情報については、 プロシージャ作成ツール をご覧ください。

    SQL

    SQL を使用し、いくつかの言語のいずれかでロジックを記述します。

    Snowpark

    Java、Python、または Scala 用の Snowpark API を使用します。

    コマンドライン

    Snowflake CLI コマンドを実行してプロシージャを作成します。

    Python API

    クライアント側の Python コマンドを実行してプロシージャを作成します。

    REST

    RESTful API に、プロシージャ作成のリクエストを行います。

  3. 必要に応じて、いくつかのツールのいずれかを使用して プロシージャを実行します。

プロシージャ作成ツール

プロシージャ は、Snowflake で利用可能ないくつかの方法のいずれかを使用して、言語とスキルセットに応じて作成できます。以下の表から、お客様のニーズに合ったツールをお選びください。

言語

アプローチ

SQL

Snowsight などで SQL コマンドを実行。

SQL CREATE PROCEDURE コマンド を実行し、以下の言語のいずれかで書かれたハンドラーコードを持つプロシージャを作成します。

Java、Python、またはScala

サポートされている言語のいずれかでコードを記述し、ローカルでコードを実行してSnowflakeで演算子を実行します。

Snowpark APIs を使用するクライアントコードを以下のいずれかの言語で実行します。

コマンドライン

コマンドラインからコマンドを実行して、Snowflakeエンティティを作成および管理します。

Snowflake CLI のコマンドを実行します。

Python

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

Snowflake Python API を使用するコードを実行します。

RESTful APIs (言語にとらわれない)

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

Snowflake REST API を使用してプロシージャの作成リクエストを行います。

キー・プロパティ

次に、プロシージャを作成するときに必要な、または通常使用される、プロパティの一部について説明します。

プロシージャ名:

プロシージャ名はハンドラー名と一致する必要はありません。名前の制約と規則の詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。

引数:

要件の詳細については、 UDFs およびストアドプロシージャの引数の定義 を参照してください。

戻り型:

Snowflakeが SQL データ型をハンドラーデータ型にマップする方法については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。

ハンドラー名:

必要な場合、これは、プロシージャが呼び出されたときに実行されるコードを含むクラスまたはメソッドの名前です。Java、Python、およびScalaで記述されたハンドラーに対してのみ、ハンドラー名を指定する必要があります。JavaScript およびSnowflakeスクリプトハンドラーの場合、インラインで指定されたすべてのコードがハンドラーとして実行されます。

依存関係:

Java、Python、Scalaで書かれたハンドラーの場合、プロシージャを作成する際などにSnowparkライブラリを指定する必要があるかもしれません。

ハンドラーで依存関係を利用できるようにする方法の詳細については、 コードで依存関係を利用できるようにする方法 をご参照ください。

ハンドラー言語ランタイム:

ハンドラー言語がJava、Python、Scalaの場合、サポートされているランタイムバージョンを示すためにランタイムバージョンを指定します。デフォルトのバージョンを使用している場合、そのデフォルトは時間の経過とともに変更されることに留意してください。

アクセス制御の要件

この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。

権限

オブジェクト

メモ

CREATE PROCEDURE

スキーマ

USAGE

プロシージャ

新しく作成されたプロシージャの USAGE 権限をロールに付与すると、そのロールを持つユーザーは、Snowflakeの他の場所でそのプロシージャを呼び出すことができます。

USAGE

外部アクセス統合

プロシージャの作成時に指定された統合がある場合は、統合に必要です。詳細については、 CREATE EXTERNAL ACCESS INTEGRATION をご参照ください。

READ

シークレット

プロシージャを作成する際に指定されたシークレットがある場合は、シークレットに必要です。詳細については、 認証情報を表すシークレットの作成 および 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。

USAGE

スキーマ

プロシージャの作成時に指定されたシークレットがある場合は、それを含むスキーマに必要です。詳細については、 認証情報を表すシークレットの作成 および 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。

スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。

指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。

セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。

使用上の注意

すべてのハンドラー言語

  • ストアドプロシージャは オーバーロード をサポートします。2つのプロシージャは、パラメーターの数またはパラメーターのデータ型が異なる場合、同じ名前を持つことができます。

  • ストアドプロシージャはアトミックではありません。ストアドプロシージャ内の1つのステートメントが失敗した場合、ストアドプロシージャ内の他のステートメントは必ずしもロールバックされるとは限りません。ストアドプロシージャとトランザクションについては、 トランザクション管理 をご参照ください。

  • メタデータについて:

    注意

    Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。

Tip

組織が呼び出し元の権利と所有者の権利のストアドプロシージャを組み合わせて使用している場合は、ストアドプロシージャの命名規則を使用して、個々のストアドプロシージャが呼び出し元の権利のストアドプロシージャか、所有者の権利のストアドプロシージャかを示すことができます。

Java

既知の制限事項 をご参照ください。

Javascript

JavaScript ストアドプロシージャは、文字列(例: 成功/失敗インジケーター)や数値(例: エラーコード)などの単一の値のみを返すことができます。より広範な情報を返す必要がある場合は、区切り文字(コンマなど)で区切られた値を含む VARCHAR、または VARIANT などの半構造化データ型を返すことができます。

Python

既知の制限事項 をご参照ください。

Scala

既知の制限事項 をご参照ください。

SQL でストアドプロシージャを作成します。

ストアドプロシージャを作成するには、 SQL を使用します。

注釈

後で使用するために保存されていないプロシージャを作成して呼び出すこともできます。この種のプロシージャのプロパティの多くは、ストアドプロシージャと同じです。詳細については、 CALL (匿名プロシージャでの場合) をご参照ください。

  1. プロシージャが呼び出されたときに実行されるハンドラーコードを記述します。

    サポートされているハンドラー言語のいずれかを使用できます。詳細については、 対応言語とツール をご参照ください。

  2. ハンドラーコードを CREATE PROCEDURE SQL ステートメントとインラインで保持するか、ステージで参照するかを選択します。

    それぞれに利点があります。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。

  3. プロシージャのプロパティを指定して、 SQL で CREATE PROCEDURE ステートメントを実行します。

    次の例のコードは、インラインハンドラー MyClass.myMethod を持つ myProc というプロシージャを作成します。ハンドラー言語はJavaであり、(ScalaやPythonで記述されたプロシージャハンドラーと同様に)Snowparkライブラリのセッションオブジェクトが必要です。ここで、 PACKAGES 句は、Snowflakeに含まれるSnowparkライブラリを参照します。

    CREATE OR REPLACE PROCEDURE myProc(fromTable STRING, toTable STRING, count INT)
      RETURNS STRING
      LANGUAGE JAVA
      RUNTIME_VERSION = '11'
      PACKAGES = ('com.snowflake:snowpark:latest')
      HANDLER = 'MyClass.myMethod'
      AS
      $$
        import com.snowflake.snowpark_java.*;
    
        public class MyClass
        {
          public String myMethod(Session session, String fromTable, String toTable, int count)
          {
            session.table(fromTable).limit(count).write().saveAsTable(toTable);
            return "Success";
          }
        }
      $$;
    
    Copy