CREATE FUNCTION¶
新しい UDF (ユーザー定義関数) を作成します。どのように構成するかによって、この関数はスカラー結果または表形式の結果を返すことができます。
UDFを作成するときは、サポートされている言語の1つでコードが記述されているハンドラーを指定します。ハンドラーの言語に応じて、ハンドラーソースコードをCREATE FUNCTIONステートメントにインラインするか、ハンドラーがプリコンパイルされている、またはステージのソースコードであるハンドラーの場所をCREATE FUNCTIONから参照することができます。
次のテーブルに、サポートされている各言語と、そのコードを CREATE FUNCTION でインラインに保持できるか、ステージに保持できるかをリストします。詳細については、 ハンドラーコードのインラインまたはステージ上での保持 をご参照ください。
| 言語 | ハンドラーの場所 | 
|---|---|
| インラインまたはステージング | |
| インライン | |
| インラインまたはステージング | |
| インラインまたはステージング | |
| インライン | 
このコマンドは次のバリアントをサポートしています。
- CREATE OR ALTER FUNCTION: 関数が存在しない場合はそれを作成し、存在する場合は既存の関数を変更します。 
- こちらもご参照ください。
- ALTER FUNCTION, DROP FUNCTION, SHOW USER FUNCTIONS , DESCRIBE FUNCTION, CREATE OR ALTER <オブジェクト> 
構文¶
CREATE FUNCTION の構文は、 UDF ハンドラーとして使用している言語によって異なります。
Javaハンドラー¶
ソースコードがインラインの場合は、以下の構文を使用します。
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
  [ [ NOT ] NULL ]
  LANGUAGE JAVA
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  [ RUNTIME_VERSION = <java_jdk_version> ]
  [ COMMENT = '<string_literal>' ]
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] ) ]
  [ PACKAGES = ( '<package_name_and_version>' [ , ... ] ) ]
  HANDLER = '<path_to_method>'
  [ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
  [ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
  [ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
  AS '<function_definition>'
ハンドラーコードがステージで参照される場合(JAR 内など)は、次の構文を使用します。
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
  [ [ NOT ] NULL ]
  LANGUAGE JAVA
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  [ RUNTIME_VERSION = <java_jdk_version> ]
  [ COMMENT = '<string_literal>' ]
  IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] )
  HANDLER = '<path_to_method>'
  [ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
  [ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
JavaScript ハンドラー¶
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
  [ [ NOT ] NULL ]
  LANGUAGE JAVASCRIPT
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  [ COMMENT = '<string_literal>' ]
  AS '<function_definition>'
Pythonハンドラー¶
ソースコードがインラインの場合は、以下の構文を使用します。
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] [ AGGREGATE ] FUNCTION [ IF NOT EXISTS ] <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
  [ [ NOT ] NULL ]
  LANGUAGE PYTHON
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  RUNTIME_VERSION = <python_version>
  [ COMMENT = '<string_literal>' ]
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] ) ]
  [ PACKAGES = ( '<package_name>[==<version>]' [ , ... ] ) ]
  [ ARTIFACT_REPOSITORY = '<repository_name>' ]
  HANDLER = '<function_name>'
  [ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
  [ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
  AS '<function_definition>'
ハンドラーコードがステージで参照される場合(モジュール内など)は、次の構文を使用します。
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] [ AGGREGATE ] FUNCTION [ IF NOT EXISTS ] <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
  [ [ NOT ] NULL ]
  LANGUAGE PYTHON
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  RUNTIME_VERSION = <python_version>
  [ COMMENT = '<string_literal>' ]
  [ ARTIFACT_REPOSITORY = '<repository_name>' ]
  IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] )
  [ PACKAGES = ( '<package_name>[==<version>]' [ , ... ] ) ]
  HANDLER = '<module_file_name>.<function_name>'
  [ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
  [ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
Scalaハンドラー¶
ソースコードがインラインの場合は、以下の構文を使用します。
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS <result_data_type>
  [ [ NOT ] NULL ]
  LANGUAGE SCALA
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  [ RUNTIME_VERSION = <scala_version> ]
  [ COMMENT = '<string_literal>' ]
  [ IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] ) ]
  [ PACKAGES = ( '<package_name_and_version>' [ , ... ] ) ]
  HANDLER = '<path_to_method>'
  [ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
  AS '<function_definition>'
ハンドラーコードがステージで参照される場合(JAR 内など)は、次の構文を使用します。
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION [ IF NOT EXISTS ] <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS <result_data_type>
  [ [ NOT ] NULL ]
  LANGUAGE SCALA
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ { VOLATILE | IMMUTABLE } ]
  [ RUNTIME_VERSION = <scala_version> ]
  [ COMMENT = '<string_literal>' ]
  IMPORTS = ( '<stage_path_and_file_name_to_read>' [ , ... ] )
  HANDLER = '<path_to_method>'
SQL ハンドラー¶
CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ SECURE ] FUNCTION <name> (
    [ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
  [ COPY GRANTS ]
  RETURNS { <result_data_type> | TABLE ( <col_name> <col_data_type> [ , ... ] ) }
  [ [ NOT ] NULL ]
  [ { VOLATILE | IMMUTABLE } ]
  [ MEMOIZABLE ]
  [ COMMENT = '<string_literal>' ]
  AS '<function_definition>'
バリアント構文¶
CREATE OR ALTER FUNCTION¶
関数がまだ存在しない場合は新規に作成し、存在する場合は既存の関数をステートメントで定義された関数に変換します。CREATE OR ALTER FUNCTION ステートメントは、 CREATE FUNCTION ステートメントの構文ルールに従い、このステートメントには ALTER FUNCTION ステートメントと同じ制限があります。
サポートされる関数の変更は以下のとおりです。
- 関数のプロパティとパラメーターを変更します。例: SECURE、 MAX_BATCH_ROWS、 LOG_LEVEL、または COMMENT。 
詳細については、 CREATE OR ALTER FUNCTION の使用上の注意 をご参照ください。
CREATE [ OR ALTER ] FUNCTION ...
注釈
COPY GRANTS パラメーターは、このバリアント構文ではサポートされていません。
必須パラメーター¶
すべての言語¶
- name ( [ arg_name arg_data_type [ DEFAULT default_value ] ] [ , ... ] )
- 識別子( - name)、入力引数、および UDF のオプション引数のデフォルト値を指定します。- 識別子用: - UDFs は 名前と引数の型の組み合わせによって識別および解決される ため、識別子は、関数が作成されるスキーマに対して一意である必要はありません。 
- 識別子はアルファベットで始まる必要があり、識別子の文字列全体が二重引用符で囲まれている場合を除き、スペースや特殊文字を含めることはできません(例: "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。識別子の要件 をご参照ください。 
 
- 入力引数の場合、 - arg_nameには、入力引数の名前を指定します。
- arg_data_typeには、使用しているハンドラー言語に対応するSnowflakeデータ型を使用します。- Javaハンドラー については、 SQL-Javaデータ型マッピング をご参照ください。 
- JavaScript ハンドラー については、 SQL および JavaScript データ型マッピング をご参照ください。 
- Pythonハンドラー については、 SQL-Pythonデータ型マッピング をご参照ください。 
- Scalaハンドラー については、 SQL-Scalaデータ型マッピング をご参照ください。 
 
- 引数が省略可能であることを示すには、 - DEFAULT default_valueを使用して引数のデフォルト値を指定します。デフォルト値には、リテラルまたは式を使用できます。- オプションの引数を指定する場合は、必須引数の後に配置する必要があります。 - 関数にオプションの引数がある場合は、同じ名前で異なる署名を持つ関数を追加で定義することはできません。 - 詳細については、 引数をオプションに指定する をご参照ください。 
 
 
- RETURNS ...
- UDF 型を決定する UDF によって返される結果を指定します。 - result_data_type: 指定されたデータ型の単一の値を返すスカラー UDF を作成します。- 注釈 - Java、Python、またはScalaで記述された UDF ハンドラーの場合、 - result_data_typeは、ハンドラー言語に対応する次のテーブルの- SQL Data Type列になければなりません。
- TABLE ( col_name col_data_type , ... ): 指定したテーブル列と列タイプで表形式の結果を返すテーブル UDF を作成します。- 注釈 - Scala UDFs の場合、戻り型 TABLE はサポートされていません。 
 
- AS function_definition
- UDFが呼び出されたときに実行されるハンドラーコードを定義します。 - function_definition値は、ハンドラーでサポートされている言語の1つのソースコードである必要があります。コードは次の場合があります。- Java。詳細については、 Java UDFs の紹介 をご参照ください。 
- JavaScript。詳細については、 JavaScript UDFs の紹介 をご参照ください。 
- Python。詳細については、 Python UDFsの紹介 をご参照ください。 
- Scala。詳細については、 Scala UDFs の紹介 をご参照ください。 
- SQL 式またはSnowflakeスクリプトのブロック。Snowflakeスクリプト UDFs は プレビュー です。詳細は、SQL UDFs の紹介 をご参照ください。 
 - 詳細については、このトピック内の 一般的な使用上の注意 をご参照ください。 - 注釈 - UDF ハンドラーコードが IMPORTS 句を含むステージで参照される場合、 AS 句は必要ありません。 
Java¶
- LANGUAGE JAVA
- コードはJava言語であることを指定します。 
- RUNTIME_VERSION = java_jdk_version
- 使用するJava JDK ランタイムバージョンを指定します。サポートされているJavaのバージョンは次のとおりです。 - 11.x 
- 17.x 
 - RUNTIME_VERSION が設定されていない場合は、Java JDK 11が使用されます。 
- IMPORTS = ( 'stage_path_and_file_name_to_read' [ , ... ] )
- インポートするファイルの場所(ステージ)、パス、および名前。 - ファイルは、 JAR ファイルまたは別の型のファイルにすることができます。 - ファイルが JAR ファイルの場合は、1個以上の.classファイルと0個以上のリソースファイルを含めることができます。 - JNI (Java Native Interface)はサポートされていません。Snowflakeは、(Javaバイトコードではなく)ネイティブコードを含むライブラリのロードを禁止しています。 - Java UDFs は、 JAR 以外のファイルも読み取ることができます。例については、 IMPORTS で静的に指定されたファイルの読み取り をご参照ください。 - ファイル(JAR ファイルまたは他のファイル)をステージにコピーする場合、 PUT コマンドは名前付き内部ステージへのファイルのコピーをサポートしており、通常は JAR ファイルをステージに移動する最も簡単な方法であるため、Snowflakeは PUT 名前付き内部ステージを使用することをお勧めします。 - 外部ステージは許可されていますが、 PUT ではサポートされていません。 - IMPORTS 句の各ファイルは、ファイルが異なるサブディレクトリまたは異なるステージにある場合でも、一意の名前を持っている必要があります。 - IMPORTS 句と TARGET_PATH 句の両方が存在する場合、ファイルが異なるサブディレクトリまたは異なるステージにあっても、 TARGET_PATH 句のファイル名は IMPORTS 句の各ファイル名とは異なる必要があります。 - TARGET_PATH が既存のファイルと一致する場合、Snowflakeはエラーを返します。TARGET_PATH を使用して既存のファイルを上書きすることはできません。 - ハンドラーがステージにある UDF の場合は、 UDF を含む JAR ファイルの場所を指定するために IMPORTS 句が必要です。 - ハンドラーコードがインラインの UDF の場合、 IMPORTS 句は、インライン UDF によって、ライブラリやテキストファイルなどの他のファイルにアクセスする必要がある場合にのみ必要です。 - Snowparkパッケージ などのSnowflakeシステムパッケージの場合、 JAR ファイルを IMPORTS で指定するのではなく、 PACKAGES 句でパッケージを指定できます。その場合は、パッケージ JAR ファイルを IMPORTS 値に含める必要はありません。 - インラインJava - AS function_definition
- インラインJava UDFs には、 関数定義 が必要です。 
 
- HANDLER = handler_name
- ハンドラーメソッドまたはクラスの名前。 - ハンドラーがスカラー UDF 用であり、表形式ではない値を返す場合、 HANDLER 値は - MyClass.myMethodのような形式のメソッド名である必要があります。
- ハンドラーが表形式のUDF用である場合、HANDLER値はハンドラークラスの名前である必要があります。 
 
JavaScript¶
- LANGUAGE JAVASCRIPT
- コードは JavaScript 言語であることを指定します。 
Python¶
- LANGUAGE PYTHON
- コードはPython言語であることを指定します。 
- RUNTIME_VERSION = python_version
- 使用するPythonのバージョンを指定します。サポートされているPythonのバージョンは次のとおりです。 - 3.13 
 - 一般公開されているバージョン: - 3.9 
- 3.10 
- 3.11 
- 3.12 
 
- IMPORTS = ( 'stage_path_and_file_name_to_read' [ , ... ] )
- インポートするファイルの場所(ステージ)、パス、および名前。 - ファイルは、 - .pyファイルまたは別の型のファイルにすることができます。- Python UDFsは、テキストファイルなどのPython以外のファイルも読み取ることができます。例については、 ファイルの読み取り をご参照ください。 - ファイルをステージにコピーする場合、 PUT コマンドは名前付き内部ステージへのファイルのコピーをサポートしており、通常は PUT コマンドはファイルをステージに移動する最も簡単な方法であるため、Snowflakeは名前付き内部ステージを使用することをお勧めします。 - 外部ステージは許可されていますが、 PUT ではサポートされていません。 - IMPORTS 句の各ファイルは、ファイルが異なるサブディレクトリまたは異なるステージにある場合でも、一意の名前を持っている必要があります。 - ハンドラーコードがステージに格納されている場合は、 IMPORTS 句を使用してハンドラーコードの場所を指定する必要があります。 - インラインPython UDFの場合、 IMPORTS 句はUDFハンドラーがライブラリやテキストファイルなどの他のファイルにアクセスする必要がある場合にのみ必要です。 - numpy などのSnowflakeシステムに含まれるパッケージの場合は、 PACKAGES 句のみでパッケージを指定し、パッケージのソースを IMPORTS 値として省略できます。 
- HANDLER = handler_name
- ハンドラー関数またはクラスの名前。 - ハンドラーがスカラーUDF用であり、表形式ではない値を返す場合、HANDLER値は関数名である必要があります。ハンドラーコードがCREATE FUNCTIONステートメントにインラインの場合、関数名のみを使用できます。ハンドラーコードがステージで参照される場合、この値は次の形式のようにモジュール名で修飾する必要があります: - my_module.my_function。
- ハンドラーが表形式のUDF用である場合、HANDLER値はハンドラークラスの名前である必要があります。 
 
Scala¶
- LANGUAGE SCALA
- コードにはScala言語を指定します。 
- RUNTIME_VERSION = scala_version
- 使用するScalaランタイムのバージョンを指定します。サポートされているScalaのバージョンは次のとおりです。 - 2.12 
 - RUNTIME_VERSION が設定されていない場合は、Scala 2.12が使用されます。 
- IMPORTS = ( 'stage_path_and_file_name_to_read' [ , ... ] )
- 場所(ステージ)、パス、および JAR またはその他の種類のファイルなど、インポートするファイルの名前。 - JAR ファイルには、ハンドラーの依存関係ライブラリが含まれている場合があります。これには、1個以上の.classファイルと0個以上のリソースファイルが含まれている可能性があります。 - JNI (Java Native Interface)はサポートされていません。Snowflakeは、(Javaバイトコードではなく)ネイティブコードを含むライブラリのロードを禁止しています。 
- JAR 以外のファイルは、ハンドラーコードによって読み取られるファイルである可能性があります。例については、 IMPORTS で静的に指定されたファイルの読み取り をご参照ください。 
 - ファイルをステージにコピーする場合、 PUT コマンドは名前付き内部ステージへのファイルのコピーをサポートしており、通常 PUT コマンドは JAR ファイルをステージに移動する最も簡単な方法であるため、Snowflakeは名前付き内部ステージを使用することをお勧めします。外部ステージは許可されていますが、 PUT ではサポートされていません。 - IMPORTS 句の各ファイルは、ファイルが異なるステージサブディレクトリまたは異なるステージにある場合でも、一意の名前を持っている必要があります。 - IMPORTS 句と TARGET_PATH 句の両方が存在する場合、ファイルが異なるステージサブディレクトリまたは異なるステージにあっても、 TARGET_PATH 句のファイル名は IMPORTS 句でリストされたいずれのファイル名とも異なっている必要があります。 - ハンドラーがステージにある UDF の場合は、 UDF を含む JAR ファイルの場所を指定するために IMPORTS 句が必要です。 - ハンドラーコードがインラインの UDF の場合、 IMPORTS 句は、インライン UDF によって、ライブラリやテキストファイルなどの他のファイルにアクセスする必要がある場合にのみ必要です。 - Snowparkパッケージ などのSnowflakeシステムパッケージの場合、 JAR ファイルを IMPORTS で指定するのではなく、 PACKAGES 句でパッケージを指定できます。その場合は、パッケージ JAR ファイルを IMPORTS 値に含める必要はありません。 - インラインScala - AS function_definition
- UDFs インラインScalaハンドラーコードを使用するには、 関数定義 が必要です。 
 
- HANDLER = handler_name
- ハンドラーメソッドまたはクラスの名前。 - ハンドラーがスカラー UDF 用であり、表形式ではない値を返す場合、 HANDLER 値は - MyClass.myMethodのような形式のメソッド名である必要があります。
 
オプションのパラメーター¶
すべての言語¶
- SECURE
- 関数が安全であることを指定します。セキュア関数の詳細については、 セキュア UDFs とストアドプロシージャの使用による機密情報の保護 をご参照ください。 
- { TEMP | TEMPORARY }
- 関数を作成した セッション の間だけ持続するように指定します。セッション終了時に仮関数をドロップします。 - デフォルト:値なし。関数が - TEMPORARYとして宣言されていない場合、その関数は永続的です。- スキーマに既存の関数と同じ名前の仮 ユーザー定義関数 を作成することはできません。 
- [ [ NOT ] NULL ]
- 関数は NULL 値を返すことができるか、 NON-NULL 値のみを返す必要があるかを指定します。デフォルトは NULL です(つまり、関数は NULL を返すことができます)。 - 注釈 - 現在、 SQL UDFs には - NOT NULL句は適用されていません。- NOT NULLとして宣言された SQL UDFs は、NULL 値を返すことができます。関数のコードに NULL 値が返されないように記述されている場合を除き、 SQL UDFs には- NOT NULLを使用しないことをSnowflakeはお勧めします。
- CALLED ON NULL INPUTまたは .- { RETURNS NULL ON NULL INPUT | STRICT }
- null入力で呼び出されたときの UDF の動作を指定します。入力がnullの場合は常にnullを返すシステム定義関数とは対照的に、 UDFs はnull入力を処理でき、入力がnullの場合でもnull以外の値を返します。 - CALLED ON NULL INPUT常にnull入力で UDF を呼び出します。そのような値を適切に処理するのは UDF 次第です。
- RETURNS NULL ON NULL INPUT(またはその同義語- STRICT)は、入力がnullの場合、 UDF を呼び出しません。代わりに、その行に対して常にnull値が返されます。UDF はnull以外の入力に対してもnullを返す場合があります。
 - 注釈 - SQLUDFs では - RETURNS NULL ON NULL INPUT(- STRICT)はサポートされていませんSQLUDFs は事実上- CALLED ON NULL INPUTを使用します。SQL UDFs では、NULLの入力値を処理する必要があります。- デフォルト: - CALLED ON NULL INPUT
- { VOLATILE | IMMUTABLE }
- 結果を返すときの UDF の動作を指定します。 - VOLATILE: UDF は、同じ入力でも(例えば、非決定性とステートフルネスのため)、異なる行に対して異なる値を返す場合があります。
- IMMUTABLE: UDF は、関数が同じ入力で呼び出された場合、常に同じ結果を返すと想定しています。この保証はチェックされません。同じ入力に対して異なる値を返す UDF に- IMMUTABLEを指定すると、未定義の動作が発生します。
 - デフォルト: - VOLATILE- 注釈 - IMMUTABLE は集計関数ではサポートされていません(AGGREGATE パラメーターを使用する場合)。したがって、すべての集計関数はデフォルトで VOLATILE です。 
- COMMENT = 'string_literal'
- SHOW FUNCTIONS および SHOW USER FUNCTIONS 出力の DESCRIPTION 列に表示される UDFのコメントを指定します。 - デフォルト: - user-defined function
- COPY GRANTS
- CREATE OR REPLACE FUNCTION を使用して新しい関数を作成するときに、元の関数のアクセス権限を保持することを指定します。 - このパラメーターは、既存の関数から新しい関数に、 OWNERSHIP を 除く すべての権限をコピーします。新しい関数は、スキーマ内のオブジェクト型に定義された将来の付与を継承します。デフォルトでは、 CREATE FUNCTION ステートメントを実行するロールが新しい関数を所有します。 - 注意: - データ共有 では、既存の関数が別のアカウントと共有されていた場合に、代替関数も共有されます。 
- 置換関数の SHOW GRANTS 出力には、ステートメントが実行されたときの現在のタイムスタンプとともに、コピーされた権限の被付与者が CREATE FUNCTION ステートメントを実行したロールとしてリストされます。 
- 付与をコピーする操作は、 CREATE FUNCTION コマンドで(つまり、同じトランザクション内で)アトミックに発生します。 
 
Java¶
- PACKAGES = ( 'package_name_and_version' [ , ... ] )
- 依存関係として必要なSnowflakeシステムパッケージの名前とバージョン番号。値は、 - package_name:version_numberの形式にする必要があります。ここで、- package_nameは、- snowflake_domain:packageです。Snowflakeにシステムで利用可能な最新バージョンを使用させるために、バージョン番号として- latestを指定できることに注意してください。- 例: - -- Use version 1.2.0 of the Snowpark package. PACKAGES=('com.snowflake:snowpark:1.2.0') -- Use the latest version of the Snowpark package. PACKAGES=('com.snowflake:snowpark:latest') - Snowflakeで次の SQL を実行すると、サポートされているシステムパッケージのリストを見つけることができます。 - SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'java'; - PACKAGES で指定する依存関係の場合は、 IMPORTS 句でその JAR ファイルを指定する必要はありません。 - インラインJava - TARGET_PATH = stage_path_and_file_name_to_write
- function_definitionで指定されたハンドラーソースコードをコンパイルした結果を含んだ JAR ファイルを、Snowflakeが書き込む場所を指定します。- この句が含まれている場合、Snowflakeは結果の JAR ファイルを句の値で指定されたステージの場所に書き込みます。この句を省略すると、Snowflakeはコードが必要になるたびにソースコードを再コンパイルします。その場合、 JAR ファイルは永久に保存されず、ユーザーは JAR ファイルをクリーンアップする必要はありません。 - TARGET_PATH が既存のファイルと一致する場合、Snowflakeはエラーを返します。TARGET_PATH を使用して既存のファイルを上書きすることはできません。 - 関数をドロップしても、生成された JAR ファイルは明示的に削除されるまで残ります。JAR は UDF をサポートするには不要になったため、 UDF をドロップする際には JAR ファイルを別途削除する必要があります。 - たとえば、以下の TARGET_PATH の例では、 - myhandler.jarファイルが生成され、- handlersステージにコピーされます。- TARGET_PATH = '@handlers/myhandler.jar' - この UDF をドロップして削除する場合は、 REMOVE コマンド を実行するなどして、そのハンドラー JAR ファイルも削除する必要があります。 - REMOVE @handlers/myhandler.jar; 
 
- EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
- この関数のハンドラーコードが外部ネットワークにアクセスするために必要な 外部アクセス統合 の名前。 - 外部アクセス統合は、 ネットワークルール と シークレット を指定します。これは、外部 REST API などの外部ネットワークをリクエストするときに、ハンドラーコードによって使用が許可される外部ロケーションと認証情報(ある場合)を指定します。 
- SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
- シークレットの名前を変数に代入し、ハンドラーコードでシークレットから情報を取得する際に、変数を使用してシークレットを参照できるようにします。 - ここで指定するシークレットは、この CREATE FUNCTION コマンドの EXTERNAL_ACCESS_INTEGRATIONS パラメーター値として指定された 外部アクセス統合 によって許可されている必要があります。 - このパラメーターの値は、次の部分からなる代入式のカンマ区切りのリストです。 - secret_nameを許可されたシークレットの名前として使用します。- EXTERNAL_ACCESS_INTEGRATIONS パラメーターで指定された統合にもシークレットが含まれていない SECRETS 値を指定すると、エラーが発生します。 
- 'secret_variable_name'を、シークレットから情報を取得する際にハンドラーコードで使用する変数にします。
 - 例などの詳細については、 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。 
Python¶
- AGGREGATE
- 関数が集計関数であることを指定します。ユーザー定義の集計関数の詳細については、 Pythonユーザー定義集計関数 をご参照ください。 - 注釈 - IMMUTABLE は集計関数ではサポートされていません(AGGREGATE パラメーターを使用する場合)。したがって、すべての集計関数はデフォルトで VOLATILE です。 
ARTIFACT_REPOSITORY = repository_name
関数で使用する PyPI パッケージのインストールに使用するリポジトリ名を指定します。
Snowflakeはこれらのパッケージをアーティファクトリポジトリからインストールします。
関数にインストールして使用したいパッケージ名のリストを指定します。
Snowflakeはこれらのパッケージをアーティファクトリポジトリからインストールします。
- PACKAGES = ( 'package_name_and_version' [ , ... ] )
- 依存関係として必要なパッケージの名前とバージョン番号。値は、 - package_name==version_numberの形式にする必要があります。バージョン番号を省略すると、Snowflakeはシステムで利用可能な最新のパッケージを使用します。- 例: - -- Use version 1.2.2 of the NumPy package. PACKAGES=('numpy==1.2.2') -- Use the latest version of the NumPy package. PACKAGES=('numpy') - Snowflakeで次の SQL を実行すると、サポートされているシステムパッケージのリストを見つけることができます。 - SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'python'; - 含まれているパッケージの詳細については、 サードパーティパッケージの使用 をご参照ください。 
- EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
- この関数のハンドラーコードが外部ネットワークにアクセスするために必要な 外部アクセス統合 の名前。 - 外部アクセス統合は、 ネットワークルール と シークレット を指定します。これは、外部 REST API などの外部ネットワークをリクエストするときに、ハンドラーコードによって使用が許可される外部ロケーションと認証情報(ある場合)を指定します。 
- SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
- シークレットの名前を変数に代入し、ハンドラーコードでシークレットから情報を取得する際に、変数を使用してシークレットを参照できるようにします。 - ここで指定するシークレットは、この CREATE FUNCTION コマンドの EXTERNAL_ACCESS_INTEGRATIONS パラメーター値として指定された 外部アクセス統合 によって許可されている必要があります。 - このパラメーターの値は、次の部分からなる代入式のカンマ区切りのリストです。 - secret_nameを許可されたシークレットの名前として使用します。- EXTERNAL_ACCESS_INTEGRATIONS パラメーターで指定された統合にもシークレットが含まれていない SECRETS 値を指定すると、エラーが発生します。 
- 'secret_variable_name'を、シークレットから情報を取得する際にハンドラーコードで使用する変数にします。
 - 例などの詳細については、 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。 
SQL¶
- MEMOIZABLE
- 関数がメモ化可能であることを指定します。 - 詳細については、 メモ化可能 UDFs をご参照ください。 
Scala¶
- PACKAGES = ( 'package_name_and_version' [ , ... ] )
- 依存関係として必要なSnowflakeシステムパッケージの名前とバージョン番号。値は、 - package_name:version_numberの形式にする必要があります。ここで、- package_nameは、- snowflake_domain:packageです。Snowflakeにシステムで利用可能な最新バージョンを使用させるために、バージョン番号として- latestを指定できることに注意してください。- 例: - -- Use version 1.7.0 of the Snowpark package. PACKAGES=('com.snowflake:snowpark:1.7.0') -- Use the latest version of the Snowpark package. PACKAGES=('com.snowflake:snowpark:latest') - Snowflakeで次の SQL を実行すると、サポートされているシステムパッケージのリストを見つけることができます。 - SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'scala'; - PACKAGES で指定する依存関係の場合は、 IMPORTS 句でその JAR ファイルを指定する必要はありません。 - TARGET_PATH = stage_path_and_file_name_to_write
- function_definitionで指定されたハンドラーソースコードをコンパイルした結果を含んだ JAR ファイルを、Snowflakeが書き込む場所を指定します。- この句が含まれている場合、Snowflakeは結果の JAR ファイルを句の値で指定されたステージの場所に書き込みます。この句を省略すると、Snowflakeはコードが必要になるたびにソースコードを再コンパイルします。その場合、 JAR ファイルは永久に保存されず、ユーザーは JAR ファイルをクリーンアップする必要はありません。 - TARGET_PATH が既存のファイルと一致する場合、Snowflakeはエラーを返します。TARGET_PATH を使用して既存のファイルを上書きすることはできません。 - 関数をドロップしても、生成された JAR ファイルは明示的に削除されるまで残ります。JAR は UDF をサポートするには不要になったため、 UDF をドロップする際には JAR ファイルを別途削除する必要があります。 - たとえば、以下の TARGET_PATH の例では、 - myhandler.jarファイルが生成され、- handlersステージにコピーされます。- TARGET_PATH = '@handlers/myhandler.jar' - この UDF をドロップして削除する場合は、 REMOVE コマンド を実行するなどして、そのハンドラー JAR ファイルも削除する必要があります。 - REMOVE @handlers/myhandler.jar; 
 
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
| 権限 | オブジェクト | 注意 | 
|---|---|---|
| CREATE FUNCTION | スキーマ | この権限は、スキーマ内のユーザー定義関数の作成のみを可能にします。 データ測定関数の作成を有効にする場合は、ロールに CREATE DATA METRIC FUNCTION 権限が必要です。 | 
| USAGE | 関数 | 新しく作成された関数の USAGE 権限をロールに付与すると、そのロールを持つユーザーは、Snowflakeの他の場所でその関数を呼び出すことができます(外部トークン化のマスキングポリシーの所有者ロールなど)。 | 
| USAGE | 外部アクセス統合 | 統合(ある場合)に必要。EXTERNAL_ACCESS_INTEGRATIONS パラメーターで指定。詳細については、 CREATE EXTERNAL ACCESS INTEGRATION をご参照ください。 | 
| READ | シークレット | シークレット(ある場合)に必要。SECRETS パラメーターで指定。詳細については、 認証情報を表すシークレットの作成 および 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。 | 
| USAGE | スキーマ | シークレットを含むスキーマ(ある場合)に必要。SECRETS パラメーターで指定。詳細については、 認証情報を表すシークレットの作成 および 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。 | 
スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する 任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
一般的な使用上の注意¶
すべての言語¶
- function_definitionにはサイズ制限があります。最大許容サイズは変更される可能性があります。
- function_definitionを囲む区切り文字は、一重引用符またはドル記号のペアのいずれかです。- 区切り文字として - $$を使用すると、一重引用符を含む関数の記述が簡単になります。- 関数の本文の区切り文字が一重引用符文字である場合、 - function_definition(文字列リテラルなど)内の一重引用符は一重引用符でエスケープする 必要があります。
- マスキングポリシー で UDF を使用する場合は、列、 UDF、およびマスキングポリシーのデータ型が一致していることを確認します。詳細については、 マスキングポリシー内のユーザー定義関数 をご参照ください。 
- UDF のハンドラーコードで CURRENT_DATABASE または CURRENT_SCHEMA 関数を指定すると、この関数は、セッションで使用中のデータベースまたはスキーマではなく、 UDF を含むデータベースまたはスキーマを返します。 
- メタデータについて。 - 注意 - Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。 
- OR REPLACEと- IF NOT EXISTS句は互いに排他的です。両方を同じステートメントで使うことはできません。
- CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。 
Java¶
- Javaでは、プリミティブデータ型は NULL 値を許可しないため、そのような型の引数に NULL を渡すと、エラーが発生します。 
- HANDLER 句では、メソッド名で大文字と小文字が区別されます。 
- IMPORTS および TARGET_PATH 句の場合、 - パッケージ、クラス、およびファイル名では 大文字と小文字が区別されます。 
- ステージ名では 大文字と小文字が区別されません。 
 
- PACKAGES 句を使用して、Snowparkの依存関係など、Snowflakeシステム定義の依存関係のパッケージ名とバージョン番号を指定できます。その他の依存関係については、 IMPORTS 句を使用して依存関係 JAR ファイルを指定します。 
- Snowflakeは次を検証します。 - CREATE FUNCTION ステートメントの HANDLER で指定された JAR ファイルが存在し、指定されたクラスとメソッドが含まれていること。 
- UDF 宣言で指定された入力および出力タイプは、Javaメソッドの入力および出力タイプと互換性があること。 
 - 検証は、アクティブなSnowflakeウェアハウスに接続しているかどうかに応じて、作成時または実行時に実行できます。 - 作成時 --- CREATE FUNCTION ステートメント実行時にアクティブなSnowflakeウェアハウスに接続している場合、 UDF は作成時に検証されます。 
- 実行時 --- アクティブなSnowflakeウェアハウスに接続していない場合、 UDF は作成されますが、すぐには検証されず、Snowflakeは以下のメッセージを返します。 - Function <名前> created successfully, but could not be validated since there is no active warehouse。
 
JavaScript¶
- Snowflakeは、 UDF の作成時に JavaScript コードを検証しません。つまり、 UDF の作成は、コードが有効かどうかに関係なく成功します。コードが有効でない場合、Snowflakeはクエリ時に UDF を呼び出したときに、エラーを返します。 
Python¶
- HANDLER 句では、ハンドラー関数名で大文字と小文字が区別されます。 
- IMPORTS 句で、 - ファイル名は 大文字と小文字が区別されます。 
- ステージ名では 大文字と小文字が区別されません。 
 
- PACKAGES 句を使用して、Snowparkの依存関係など、依存関係のパッケージ名とバージョン番号を指定できます。その他の依存関係については、 IMPORTS 句を使用して依存関係ファイルを指定します。 
- Snowflakeは次を検証します。 - CREATE FUNCTION ステートメントの HANDLER で指定された関数またはクラスが存在します。 
- UDF宣言で指定された入力および出力タイプは、ハンドラーの入力および出力タイプと互換性があること。 
 
Scala¶
- HANDLER 句では、メソッド名で大文字と小文字が区別されます。 
- IMPORTS および TARGET_PATH 句の場合、 - パッケージ、クラス、およびファイル名では 大文字と小文字が区別されます。 
- ステージ名では 大文字と小文字が区別されません。 
 
- PACKAGES 句を使用して、Snowparkの依存関係など、Snowflakeシステム定義の依存関係のパッケージ名とバージョン番号を指定できます。その他の依存関係については、 IMPORTS 句を使用して依存関係 JAR ファイルを指定します。 
- Snowflakeは次を検証します。 - CREATE FUNCTION ステートメントの HANDLER で指定された JAR ファイルが存在し、指定されたクラスとメソッドが含まれていること。 
- UDF 宣言で指定された入力および出力タイプは、Scalaメソッドの入力および出力タイプと互換性があること。 
 - 検証は、アクティブなSnowflakeウェアハウスに接続しているかどうかに応じて、作成時または実行時に実行できます。 - 作成時 --- CREATE FUNCTION ステートメント実行時にアクティブなSnowflakeウェアハウスに接続している場合、 UDF は作成時に検証されます。 
- 実行時 --- アクティブなSnowflakeウェアハウスに接続していない場合、 UDF は作成されますが、すぐには検証されず、Snowflakeは以下のメッセージを返します。 - Function <名前> created successfully, but could not be validated since there is no active warehouse。
 
SQL¶
- 現在、 SQL UDFs には NOT NULL 句は適用されていません。 
CREATE OR ALTER FUNCTION の使用上の注意¶
- ALTER FUNCTION コマンドのすべての制限が適用されます。 
- FUNCTION を PROCEDURE に、 PROCEDURE を FUNCTION に置き換えたり変換したりすることはできません。 
- 仮の FUNCTION を仮でない FUNCTION に、あるいは仮でない FUNCTION を仮の FUNCTION に置き換えたり変換したりすることはできません。 
- 通常の FUNCTION を EXTERNAL FUNCTION に、または EXTERNAL FUNCTION を通常の FUNCTION に置き換えたり変換したりすることはできません。 
- LANGUAGE、 IMPORTS、 RETURNS、 HANDLER、 RUNTIME_VERSION、 PACKAGES、 VOLATILITY、 NULL_HANDLING、 TARGET_PATH プロパティの変更はサポートされていません。 
- タグの設定や設定解除はサポートされていません。既存のタグは、 CREATE OR ALTER FUNCTION ステートメントによって変更されることはなく、そのまま残ります。 
例¶
Java¶
インラインハンドラーを使用した CREATE FUNCTION の基本的な例を次に示します。
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
  RETURNS VARCHAR
  LANGUAGE JAVA
  CALLED ON NULL INPUT
  HANDLER = 'TestFunc.echoVarchar'
  TARGET_PATH = '@~/testfunc.jar'
  AS
  'class TestFunc {
    public static String echoVarchar(String x) {
      return x;
    }
  }';
ステージングされたハンドラーへの参照を使用した CREATE FUNCTION の基本的な例を次に示します。
create function my_decrement_udf(i numeric(9, 0))
    returns numeric
    language java
    imports = ('@~/my_decrement_udf_package_dir/my_decrement_udf_jar.jar')
    handler = 'my_decrement_udf_package.my_decrement_udf_class.my_decrement_udf_method'
    ;
Java UDFs のさらなる例については、 例 をご参照ください。
JavaScript¶
js_factorial という名前のJavaScript UDFを作成します。
CREATE OR REPLACE FUNCTION js_factorial(d double)
  RETURNS double
  LANGUAGE JAVASCRIPT
  STRICT
  AS '
  if (D <= 0) {
    return 1;
  } else {
    var result = 1;
    for (var i = 2; i <= D; i++) {
      result = result * i;
    }
    return result;
  }
  ';
Python¶
次の例のコードは、ハンドラーコードが udf としてインラインの py_udf 関数を作成します。
CREATE OR REPLACE FUNCTION py_udf()
  RETURNS VARIANT
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.10'
  PACKAGES = ('numpy','pandas','xgboost==1.5.0')
  HANDLER = 'udf'
AS $$
import numpy as np
import pandas as pd
import xgboost as xgb
def udf():
    return [np.__version__, pd.__version__, xgb.__version__]
$$;
次の例のコードは、ハンドラーが @my_stage ステージにある sleepy.py ファイル内の dream 関数を作成します。
CREATE OR REPLACE FUNCTION dream(i int)
  RETURNS VARIANT
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.10'
  HANDLER = 'sleepy.snore'
  IMPORTS = ('@my_stage/sleepy.py')
Scala¶
インラインハンドラーを使用した CREATE FUNCTION の基本的な例を次に示します。
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
  RETURNS VARCHAR
  LANGUAGE SCALA
  RUNTIME_VERSION = 2.12
  HANDLER='Echo.echoVarchar'
  AS
  $$
  class Echo {
    def echoVarchar(x : String): String = {
      return x
    }
  }
  $$;
ステージングされたハンドラーへの参照を使用した CREATE FUNCTION の基本的な例を次に示します。
CREATE OR REPLACE FUNCTION echo_varchar(x VARCHAR)
  RETURNS VARCHAR
  LANGUAGE SCALA
  RUNTIME_VERSION = 2.12
  IMPORTS = ('@udf_libs/echohandler.jar')
  HANDLER='Echo.echoVarchar';
Scala UDFs のその他の例については、 Scala UDF ハンドラーの例 をご参照ください。
SQL¶
数学定数piのハードコーディングされた近似値を返す単純な SQL スカラー UDF を作成します。
CREATE FUNCTION pi_udf()
  RETURNS FLOAT
  AS '3.141592654::FLOAT'
  ;
ハードコードされた値を返す単純な SQL テーブル UDF を作成します。
CREATE FUNCTION simple_table_function ()
  RETURNS TABLE (x INTEGER, y INTEGER)
  AS
  $$
    SELECT 1, 2
    UNION ALL
    SELECT 3, 4
  $$
  ;
SELECT * FROM TABLE(simple_table_function());
出力:
SELECT * FROM TABLE(simple_table_function());
+---+---+
| X | Y |
|---+---|
| 1 | 2 |
| 3 | 4 |
+---+---+
複数のパラメーターを受け入れる UDF を作成します。
CREATE FUNCTION multiply1 (a number, b number)
  RETURNS number
  COMMENT='multiply two numbers'
  AS 'a * b';
クエリの結果を返す get_countries_for_user という名前の SQL テーブル UDF を作成します。
CREATE OR REPLACE FUNCTION get_countries_for_user ( id NUMBER )
  RETURNS TABLE (country_code CHAR, country_name VARCHAR)
  AS 'SELECT DISTINCT c.country_code, c.country_name
      FROM user_addresses a, countries c
      WHERE a.user_id = id
      AND c.country_code = a.country_code';
CREATE OR ALTER FUNCTION コマンドを使って簡単な関数を作成し、変更する¶
2つの数値を受け取る関数 multiply を作成します。
CREATE OR ALTER FUNCTION multiply(a NUMBER, b NUMBER)
  RETURNS NUMBER
  AS 'a * b';
multiply にコメントを追加し、関数をセキュリティで保護します。
CREATE OR ALTER SECURE FUNCTION multiply(a NUMBER, b NUMBER)
  RETURNS NUMBER
  COMMENT = 'Multiply two numbers.'
  AS 'a * b';
