UDFs およびストアドプロシージャの引数の定義¶
関数またはプロシージャを定義するために実行する CREATE FUNCTION または CREATE PROCEDURE では、渡すことのできる引数を指定します。例:
CREATE FUNCTION my_function(integer_argument INT, varchar_argument VARCHAR)
...
CREATE PROCEDURE my_procedure(boolean_argument BOOLEAN, date_argument DATE)
...
関数またはプロシージャを呼び出すと、引数の値はハンドラーの引数にバインドされます。ハンドラーに使用している言語に応じて、値は一致する名前または引数の位置に基づきバインドされる場合があります。
このトピックでは、関数やプロシージャの引数を指定する際のガイドラインを提供します。
入力引数の数の制限¶
スカラー関数(UDFs)には、入力引数に500個の制限があります。
引数のデータ型を指定する¶
ハンドラーコードで使用する引数のデータ型に対応する SQL データ型を選択します。
Snowflakeが SQL データ型をハンドラーデータ型にマップする方法については、 SQL とハンドラー言語間のデータ型マッピング をご参照ください。
Java、Python、およびScalaプロシージャでは、 Session
引数を省略します。¶
Java、Python、またはScalaで記述されたプロシージャの CREATE PROCEDURE ステートメントでは、Snowpark Session
オブジェクトの引数を定義しないでください。
たとえば、ハンドラーコードが Session
オブジェクトと String
オブジェクトを渡すとします。
public String queryTable(Session session, String tableName) { ... }
CREATE PROCEDURE ステートメントでは、 Session
オブジェクトの引数を定義しないでください。代わりに、入力文字列の引数を定義するのみです。
CREATE OR REPLACE PROCEDURE query_table(table_name VARCHAR)
...
Session
は、プロシージャを呼び出すときに指定しない暗黙の引数です。ランタイムでストアドプロシージャを呼び出すと、Snowflakeは Session
オブジェクトを作成し、ストアドプロシージャに渡します。
引数をオプションに指定する¶
引数をオプションにすることを指定できます。詳細については、次のセクションをご参照ください。
引数をオプションとして指定¶
引数をオプションにする場合は、 DEFAULT キーワードを使用して、引数のデフォルト値を指定します。例:
CREATE OR REPLACE FUNCTION build_string_udf(
word VARCHAR,
prefix VARCHAR DEFAULT 'pre-',
suffix VARCHAR DEFAULT '-post'
)
...
CREATE OR REPLACE PROCEDURE build_string_proc(
word VARCHAR,
prefix VARCHAR DEFAULT 'pre-',
suffix VARCHAR DEFAULT '-post'
)
...
引数のデフォルト値には、式を使用できます。例:
CREATE OR REPLACE FUNCTION my_date_udf(optional_date_arg DATE DEFAULT CURRENT_DATE())
...
オプションの引数は、必須引数の後(ある場合)に指定する必要があります。必須引数の前にオプションの引数を指定することはできません。
-- This is not allowed.
CREATE FUNCTION wrong_order(optional_argument INTEGER DEFAULT 0, required_argument INTEGER)
...
オプションの引数による関数およびプロシージャのオーバーロード¶
関数やプロシージャを オーバーロード する場合は、オプションの引数を使用して異なる署名を区別することはできません。たとえば、引数を渡さない次の UDF を作成するとします。
CREATE FUNCTION my_udf_a()
...
オプションの引数を渡す同じ名前の UDF を作成しようとすると、 CREATE FUNCTION ステートメントは失敗します。
CREATE FUNCTION my_udf_a(optional_arg INTEGER DEFAULT 0)
...
000949 (42723): SQL compilation error:
Cannot overload FUNCTION 'MY_UDF_A' as it would cause ambiguous FUNCTION overloading.
別の例として、 INTEGER 必須引数を渡す UDF を作成するとします。
CREATE FUNCTION my_udf_b(required_arg INTEGER)
...
INTEGER 必須引数とオプションの引数を渡す同じ名前の UDF を作成しようとすると、 CREATE FUNCTION ステートメントは失敗します。
CREATE FUNCTION my_udf_b(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
...
000949 (42723): SQL compilation error:
Cannot overload FUNCTION 'MY_UDF_B' as it would cause ambiguous FUNCTION overloading.
これは、 ALTER FUNCTION ... RENAME または ALTER PROCEDURE ... RENAME を使用して関数やプロシージャの名前を変更する場合にも影響します。関数やプロシージャの名前を変更する場合は、同じ名前と署名を持つ既存の関数は存在できません。オプションの引数は、ある署名と別の署名を区別しません。
たとえば、 abc_udf
という名前の UDF を作成し、 INTEGER 必須引数を渡すとします。
CREATE FUNCTION abc_udf(required_arg INTEGER)
...
INTEGER 必須引数とオプション引数を渡す、別の名前(def_udf
)の UDF を作成するとします。
CREATE FUNCTION def_udf(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
...
def_udf
の名前を abc_udf
に変更しようとすると、同じ名前で同じ型の必須引数を持つ UDF がすでに存在するため、エラーが発生します。
000949 (42723): SQL compilation error:
Cannot overload FUNCTION 'ABC_UDF' as it would cause ambiguous FUNCTION overloading.
オプションの引数を持つ関数やプロシージャの呼び出し¶
オプションの引数を持つ関数やプロシージャを呼び出すには、次をご参照ください。