カテゴリ:

ユーザー定義関数、外部関数、およびストアドプロシージャ用の DDL

CREATE PROCEDURE

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

プロシージャは、次のいずれかの言語で記述できます。

注釈

匿名の(格納されているのではなく)プロシージャを作成して呼び出す場合は、 CALL (匿名プロシージャの場合) を使用します。匿名プロシージャの作成には、 CREATE PROCEDURE スキーマ権限を持つロールは必要ありません。

こちらもご参照ください。

ALTER PROCEDUREDROP PROCEDURESHOW PROCEDURESDESCRIBE PROCEDURECALL

構文

JavaおよびScala

インラインストアドプロシージャの場合は、次の構文を使用します。

CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE { SCALA | JAVA }
  RUNTIME_VERSION = '<scala_or_java_runtime_version>'
  PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<fully_qualified_method_name>'
  [ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  AS '<procedure_definition>'

Java および Scalaでプリコンパイル済みのストアドプロシージャ の場合は、次の構文を使用します。

CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE { SCALA | JAVA }
  RUNTIME_VERSION = '<scala_or_java_runtime_version>'
  PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<fully_qualified_method_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]

JavaScript

CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE JAVASCRIPT
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  AS '<procedure_definition>'

重要

JavaScript は大文字と小文字を区別しますが、 SQL は区別しません。JavaScriptコードでストアドプロシージャの引数名を使用する際の重要な情報については、 JavaScript 引数の大文字と小文字の区別 をご参照ください。

Python

インラインストアドプロシージャの場合は、次の構文を使用します。

CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE PYTHON
  RUNTIME_VERSION = '<python_version>'
  PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]` ... ])
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<function_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  AS '<procedure_definition>'

コードがステージ上のファイルにあるストアドプロシージャの場合は、次の構文を使用します。

CREATE [ OR REPLACE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE PYTHON
  RUNTIME_VERSION = '<python_version>'
  PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]` ... ])
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
  HANDLER = '<module_file_name>.<function_name>'
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]

Snowflakeスクリプト

CREATE [ OR REPLACE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
    [ NOT NULL ]
  LANGUAGE SQL
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  AS <procedure_definition>

注釈

SnowSQL または従来のウェブインターフェイスでSnowflakeスクリプトプロシージャを作成する場合は、 procedure definition の前後に 文字列リテラル区切り文字' または $$)を使用する必要があります。 SnowSQL でのSnowflakeスクリプトと従来のウェブインターフェイスの使用 をご参照ください。

必須パラメーター

すべての言語

name ( [ arg_name arg_data_type ] [ , ... ] )

ストアドプロシージャの識別子(name)と入力引数を指定します。

RETURNS result_data_type [ NOT NULL ]

ストアドプロシージャによって返される結果の型を指定します。

  • result_data_type には、使用している言語の型に対応するSnowflakeデータ型を使用します。

    注釈

    Snowpark(JavaまたはScala)で作成するストアドプロシージャには、戻り値が必要です。Snowpark(Python)では、ストアドプロシージャが値を返さない場合、 None を返していると見なされます。プロシージャが明示的に何も返さない場合でも、すべての CREATE PROCEDURE ステートメントに戻り型を定義する RETURNS 句を含める必要があることに注意してください。

  • 返されたテーブルの列の Snowflakeデータ型 がわかっている場合、 RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ) には、列名と型を指定します。

    CREATE OR REPLACE PROCEDURE get_top_sales()
    RETURNS TABLE (sales_date DATE, quantity NUMBER)
    ...
    

    それ以外の場合(実行時に列タイプを決定する場合など)は、列名と型を省略できます。

    CREATE OR REPLACE PROCEDURE get_top_sales()
    RETURNS TABLE ()
    

    注釈

    現在、 CREATE PROCEDURERETURNS TABLE(...) 句では、列型として GEOGRAPHY を指定できません。

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
    RETURNS TABLE(g GEOGRAPHY)
    ...
    

    指定した場合にストアドプロシージャを呼び出すと、次のエラーが発生します。

    CALL test_return_geography_table_1();
    
    Stored procedure execution error: data type of returned table does not match expected returned table type
    

    これを回避するには、 RETURNS TABLE() の列の引数と型を省略できます。

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
    RETURNS TABLE()
    ...
    

    RETURNS TABLE(...) は、テーブルを返すSnowflakeスクリプトのストアドプロシージャでのみサポートされます。 RETURN をご参照ください。

実際問題として、呼び出しは式の一部とすることはできないため、戻り値は使用できません。

LANGUAGE language

ストアドプロシージャコードの言語を指定します。これは、 Snowflakeスクリプト で記述されたストアドプロシージャでは、オプションであることに注意してください。

現在、 language でサポートされている値は次のとおりです。

デフォルト: SQL

AS procedure_definition

ストアドプロシージャによって実行されるコードを定義します。定義は、任意の有効なコードで構成できます。

次の点に注意してください。

  • コードがインラインでないストアドプロシージャの場合は、AS句を省略します。これには、Snowpark ScalaJava でプリコンパイルされたストアドプロシージャ、および コードがステージにあるPythonストアドプロシージャ が含まれます。

    代わりにIMPORTS句を使用して、ストアドプロシージャのコードを含むファイルの場所を指定します。詳細については、以下をご参照ください。

  • 次の場合は、 procedure definition の前後に 文字列リテラル区切り文字' または $$)を使用する必要があります。

  • JavaScript のストアドプロシージャで、改行を含む文字列を記述している場合は、文字列の前後にバッククォート(別称「バックティック」)を使用できます。

    次の JavaScript ストアドプロシージャの例では、ストアドプロシージャの本文に一重引用符と二重引用符が含まれているため、 $$ とバッククォートを使用しています。

    CREATE OR REPLACE TABLE table1 ("column 1" VARCHAR);
    
    CREATE or replace PROCEDURE proc3()
      RETURNS VARCHAR
      LANGUAGE javascript
      AS
      $$
      var rs = snowflake.execute( { sqlText: 
          `INSERT INTO table1 ("column 1") 
               SELECT 'value 1' AS "column 1" ;`
           } );
      return 'Done.';
      $$;
    
  • Snowflakeスクリプト 以外の言語の場合、 CREATE PROCEDURE コマンドを実行しても、Snowflakeはコードを包括的には検証しません。

    たとえば、Snowpark(Scala)ストアドプロシージャの場合、入力引数の数と型は検証されますが、関数の本文は検証されません。1つまたは複数の型が一致しない場合(例: 引数が非数値型のときにSnowflakeデータ型 NUMBER が使用されている場合)に、 CREATE PROCEDURE コマンドを実行するとエラーが発生します。

    コードが有効でない場合は、 CREATE PROCEDURE コマンドが成功し、ストアドプロシージャが呼び出されたときにエラーが返されます。

ストアドプロシージャの詳細については、 ストアドプロシージャの使用 をご参照ください。

Java、Python、またはScala

RUNTIME_VERSION = 'language_runtime_version'

使用する言語ランタイムバージョン。サポートされているバージョンは次のとおりです。

  • Java: 11

  • Python: 3.8

  • Scala: 2.12

PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )

ハンドラーコードの実行環境に含める必要があるSnowflakeに展開された、パッケージの名前のコンマ区切りリスト。Snowparkパッケージはストアドプロシージャに必要なため、常に PACKAGES 句で参照する必要があります。Snowparkの詳細については、 Snowpark をご参照ください。

Snowflakeがストアドプロシージャを実行する環境には、サポートされている言語用に選択されたパッケージのセットがデフォルトで含まれています。PACKAGES 句でこれらのパッケージを参照する場合、パッケージはSnowflakeですでに利用可能であるため、 IMPORTS 句でパッケージを含むファイルを参照する必要はありません。パッケージのバージョンを指定することもできます。

指定の言語用にサポートされているパッケージとバージョンのリストについては、 INFORMATION_SCHEMA.PACKAGES ビュー でその言語を指定している行をクエリします。例:

select * from information_schema.packages where language = '<language>';

ここで、 languagejavapython、または scala です。

PACKAGES でパッケージを参照するための構文は、以下で説明するように、パッケージの言語によって異なります。

  • Java

    次の形式を使用して、パッケージ名とバージョン番号を指定します。

    domain:package_name:version
    

    最新バージョンを指定するには、 latest に対して version を指定します。

    たとえば、Snowflakeにある最新のSnowparkライブラリのパッケージを含めるには、次を使用します。

    PACKAGES = ('com.snowflake:snowpark:latest')
    

    Snowparkライブラリからのパッケージを指定する場合は、バージョン1.3.0以降を指定する必要があります。

  • Python

    Snowflakeには、Anacondaから入手できる多数のパッケージが含まれています。詳細については、 サードパーティパッケージの使用 をご参照ください。

    次の形式を使用して、パッケージ名とバージョン番号を指定します。

    package_name[==version]
    

    最新バージョンを指定する場合は、バージョン番号を省略します。

    たとえば、spacyパッケージバージョン2.3.5を(必要なSnowparkパッケージの最新バージョンとともに)含めるには、次を使用します。

    PACKAGES = ('snowflake-snowpark-python', 'spacy==2.3.5')
    

    Snowparkライブラリからのパッケージを指定する場合は、バージョン0.4.0以降を指定する必要があります。Snowflakeで利用可能な最新バージョンを使用するには、バージョン番号を省略します。

  • Scala

    次の形式を使用して、パッケージ名とバージョン番号を指定します。

    domain:package_name:version
    

    最新バージョンを指定するには、 latest に対して version を指定します。

    たとえば、Snowflakeにある最新のSnowparkライブラリのパッケージを含めるには、次を使用します。

    PACKAGES = ('com.snowflake:snowpark:latest')
    

    Snowflakeは、ScalaストアドプロシージャでSnowparkバージョン0.9.0以降の使用をサポートしています。ただし、これらのバージョンには制限があることに注意してください。たとえば、1.1.0より前のバージョンは、ストアドプロシージャでトランザクションの使用をサポートしていません。

HANDLER = 'fully_qualified_method_name'

  • Python

    ストアドプロシージャの関数またはメソッドの名前を使用します。これは、コードがインラインであるか、ステージで参照されているかによって異なります。

    • コードがインラインの場合、次の例のように、関数名だけを指定できます。

      CREATE OR REPLACE PROCEDURE MYPROC(from_table STRING, to_table STRING, count INT)
        ...
        HANDLER = 'run'
      AS
      $$
      def run(session, from_table, to_table, count):
        ...
      $$;
      
    • コードをステージからインポートする場合は、完全修飾ハンドラー関数名を <モジュール名>.<関数名> として指定します。

      CREATE OR REPLACE PROCEDURE MYPROC(from_table STRING, to_table STRING, count INT)
        ...
        IMPORTS = ('@mystage/my_py_file.py')
        HANDLER = 'my_py_file.run';
      
  • JavaおよびScala

    ストアドプロシージャのメソッドまたは関数の完全修飾名を使用します。これは通常、次の形式です。

    com.my_company.my_package.MyClass.myMethod
    

    条件:

    com.my_company.my_package
    

    オブジェクトまたはクラスを含むパッケージに対応します。

    package com.my_company.my_package;
    

オプションのパラメーター

すべての言語

SECURE

プロシージャがセキュアであることを指定します。セキュアプロシージャの詳細については、 セキュア UDFs とストアドプロシージャの使用による機密情報の保護 をご参照ください。

[ [ NOT ] NULL ]

ストアドプロシージャにより NULL 値を返すことができるか、 NON-NULL 値のみを返す必要があるかを指定します。

デフォルトは NULL です(つまり、ストアドプロシージャは NULL を返すことができます)。

CALLED ON NULL INPUT または . RETURNS NULL ON NULL INPUT | STRICT

null入力で呼び出されたときのストアドプロシージャの動作を指定します。入力がnullの場合は常にnullを返すシステム定義関数とは対照的に、ストアドプロシージャはnull入力を処理でき、入力がnullの場合でもnull以外の値を返します。

  • CALLED ON NULL INPUT 常にnull入力でストアドプロシージャを呼び出します。そのような値を適切に処理するのは手順次第です。

  • RETURNS NULL ON NULL INPUT (またはその同義語 STRICT)は、入力がnullの場合にストアドプロシージャを呼び出さないため、ストアドプロシージャ内のステートメントは実行されません。代わりに、null値が常に返されます。プロシージャは、null以外の入力に対してもnullを返す場合があります。

デフォルト: CALLED ON NULL INPUT

VOLATILE | IMMUTABLE

非推奨

注意

これらのキーワードは、ストアドプロシージャでは廃止されています。これらのキーワードは、ストアドプロシージャに適用することを目的としたものではありません。将来のリリースでは、これらのキーワードはドキュメントから削除される予定です。

COMMENT = 'string_literal'

SHOW PROCEDURES 出力の DESCRIPTION 列に表示されるストアドプロシージャのコメントを指定します。

デフォルト: stored procedure

EXECUTE AS CALLER または . EXECUTE AS OWNER

ストアドプロシージャが、所有者の権限(「所有者の権利」ストアドプロシージャ)または呼び出し元の権限(「呼び出し元の権利」ストアドプロシージャ)で実行するかどうかを指定します。

  • CREATE PROCEDURE ... EXECUTE AS CALLER ステートメントを実行すると、その後、プロシージャは呼び出し元の権限プロシージャとして実行されます。

  • CREATE PROCEDURE ... EXECUTE AS OWNER を実行すると、その後、プロシージャは所有者の権利プロシージャとして実行されます。

デフォルトでは(プロシージャの作成時に OWNER も CALLER も明示的に指定されていない場合)、プロシージャは所有者の権限のストアドプロシージャとして実行されます。

所有者の権利のストアドプロシージャは、呼び出し側の環境(呼び出し側のセッション変数など)へのアクセスが少なく、Snowflakeはデフォルトでこの高いレベルのプライバシーとセキュリティを使用します。

詳細については、 呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。

デフォルト: OWNER

Java、Python、またはScala

IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )

インポートするファイルの場所(ステージ)、パス、および名前。ストアドプロシージャが依存するファイルを含めるには、 IMPORTS 句を設定する必要があります。

  • インラインストアドプロシージャを作成している場合は、コードがストアドプロシージャまたはリソースファイルの外部で定義されたクラスに依存している場合を除き、この句を省略できます。

  • JavaまたはScala: プリコンパイル済みストアドプロシージャを作成する場合は、ストアドプロシージャの定義を含むJARファイルも含める必要があります。

  • Python: ストアドプロシージャのコードがステージ上にある場合は、コードが含まれているモジュールファイルへのパスも含める必要があります。

IMPORTS 句の各ファイルは、ファイルが異なるサブディレクトリまたは異なるステージにある場合でも、一意の名前を持っている必要があります。

TARGET_PATH = 'stage_path_and_file_name_to_write'

JavaまたはScalaのストアドプロシージャの場合、 TARGET_PATH 句は、 procedure_definition で指定されたソースコードをコンパイルした後に、コンパイルされたコード(JAR ファイル)をSnowflakeが書き込む場所を指定します。この句を省略すると、Snowflakeはコードが必要になるたびにソースコードを再コンパイルします。

注釈

この句は、コードがPythonであるストアドプロシージャには必要ありません。

この句を指定した場合、

  • これを既存のファイルに設定することはできません。 TARGET_PATH が既存のファイルをポイントしている場合、Snowflakeはエラーを返します。

  • IMPORTS 句と TARGET_PATH 句の両方を指定する場合は、ファイルが異なるサブディレクトリまたは異なるステージにあっても、 TARGET_PATH 句にあるファイル名と IMPORTS 句にある各ファイル名は異なる必要があります。

  • ストアドプロシージャを使用する必要がなくなった場合(例: ストアドプロシージャを削除した場合)は、この JAR ファイルを手動で削除する必要があります。

使用上の注意

  • すべてのストアドプロシージャでは、

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

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

    • CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、古いオブジェクトの削除と新しいオブジェクトの作成が1つのトランザクションで処理されます。

    • メタデータについて:

      注意

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

    ちなみに

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

  • JavaScript ストアドプロシージャの場合、

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

  • Javaストアドプロシージャについては、 既知の制限 をご参照ください。

  • Pythonストアドプロシージャについては、 既知の制限 をご参照ください。

  • Scalaストアドプロシージャについては、 既知の制限 をご参照ください。

これにより、ハードコードされた値を返す簡単なストアドプロシージャが作成されます。これは非現実的ですが、最小限の JavaScript コードで基本的な SQL 構文を示しています。

create or replace procedure sp_pi()
    returns float not null
    language javascript
    as
    $$
    return 3.1415926;
    $$
    ;

これは、 JavaScript API への呼び出しを含むより現実的な例を示しています。このプロシージャのより広範なバージョンでは、ユーザーが直接挿入する権限を持っていないテーブルにデータを挿入できます。JavaScript ステートメントは、特定の要件が満たされた場合にのみ、入力パラメーターをチェックし、 SQL INSERT を実行できます。

create or replace procedure stproc1(FLOAT_PARAM1 FLOAT)
    returns string
    language javascript
    strict
    execute as owner
    as
    $$
    var sql_command = 
     "INSERT INTO stproc_test_table1 (num_col1) VALUES (" + FLOAT_PARAM1 + ")";
    try {
        snowflake.execute (
            {sqlText: sql_command}
            );
        return "Succeeded.";   // Return a success/error indicator.
        }
    catch (err)  {
        return "Failed: " + err;   // Return a success/error indicator.
        }
    $$
    ;

その他の例については、 ストアドプロシージャの使用 をご参照ください。

最上部に戻る