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

ロジックに使用するハンドラーなど、プロシージャのプロパティを指定する CREATE PROCEDURE コマンドを使用して、ストアドプロシージャを作成します。

このトピックでは、プロシージャを作成するステップをリストします。例については、 CREATE PROCEDURE リファレンス をご参照ください。

注釈

後で使用するために保存されていないプロシージャを作成して呼び出すこともできます。この種のプロシージャのプロパティの多くは、ストアドプロシージャと同じです。詳細については、 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

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

    • プロシージャ名。

      名前は、ハンドラーメソッドの名前と一致する必要はありません。CREATE PROCEDURE ステートメントは、プロシージャ名をハンドラーに関連付けます。

      名前の制約と規則の詳細については、 プロシージャおよび UDFs の命名とオーバーロード をご参照ください。

    • プロシージャの引数(存在する場合)。

      UDFs およびストアドプロシージャの引数の定義 をご参照ください。

    • RETURNS 句を使用した戻り型。

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

    • HANDLER 句を使用したハンドラー名。

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

      次のテーブルは、ハンドラー言語に基づく HANDLER 句の値の形式を示しています。

      ハンドラー言語

      値の形式

      Java

      クラスとメソッド名。

      例: MyClass.myMethod

      JavaScript

      なし。

      Python

      クラスが使用されている場合は、クラスとメソッド名。それ以外の場合は、関数名。

      例: module.my_function または my_function

      Scala

      オブジェクトとメソッド名。

      例: MyObject.myMethod

      Snowflakeスクリプト

      なし。

    • IMPORTS または PACKAGES 句を使用したハンドラーが必要とする依存関係(存在する場合)。

      Java、Python、またはScalaで記述されたハンドラーの場合は、 CREATE PROCEDURE リファレンスで説明されているように、必ずSnowparkライブラリを指定してください。

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

    • RUNTIME_VERSION 句を使用したハンドラー言語ランタイム。

      ハンドラー言語がJava、Python、またはScalaの場合は、 RUNTIME_VERSION 句を使用して、使用するサポート対象のランタイムバージョンを指定します。句を省略すると、Snowflakeに対してデフォルトを使用するように求められますが、これは将来変更される可能性があります。

インラインハンドラー

次の例のコードは、Pythonインラインハンドラー関数 run を使用して my_proc というプロシージャを作成します。コードは、 PACKAGES 句を介して、含まれているPython用のSnowparkライブラリを参照します。Pythonがプロシージャハンドラー言語である場合は、その Session が必要です。

create or replace procedure my_proc(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

ステージングされたハンドラー

次の例のコードは、ステージングされたJavaハンドラーメソッド MyClass.myMethod を使用して my_proc というプロシージャを作成します。コードは、 PACKAGES 句を介して、含まれているJava用のSnowparkライブラリを参照します。Javaがプロシージャハンドラー言語である場合は、その Session が必要です。IMPORTS 句を使用すると、コードはハンドラーコードを含むステージングされた JAR ファイルを参照します。

create or replace procedure my_proc(fromTable string, toTable string, count int)
  returns string
  language java
  runtime_version = '11'
  packages = ('com.snowflake:snowpark:latest')
  imports = ('@mystage/myjar.jar')
  handler = 'MyClass.myMethod';
Copy