プロシージャおよび UDFs の命名とオーバーロード

ストアドプロシージャまたはユーザー定義関数(UDF)を作成または呼び出すときは、Snowflakeが許可および強制する命名規則に注意する必要があります。

また、ストアドプロシージャや UDFs をオーバーロードし、特定のプロシージャや関数に異なる署名を提供することもできます。

注釈

ユーザー定義関数の名前の長さ(関数名の長さ、戻り型、および関数のすべてのパラメーター名を合計した長さ)が、10,000バイトを超えることはできません。この制限を超える名前を持つ関数を作成しようとすると、次のようなエラーメッセージが表示されます。

Function name (including parameter and return type) too long.

プロシージャまたは UDF の名前の選択

プロシージャと UDFs の名前は、 オブジェクト識別子 の規則に準拠する必要があります。

注釈

ただし、Snowflakeでは、システム定義関数と同じ名前のプロシージャは作成できません。

プロシージャまたは UDF の呼び出し

ストアドプロシージャまたは UDF を作成するときは、指定したデータベースとスキーマに作成します。プロシージャと UDFs は、 db.schema.procedure_or_function_name の形式で、名前空間により定義された完全修飾名を持っています。

次のステートメントでは、完全修飾名を使用してストアドプロシージャを呼び出します。

CALL mydatabase.myschema.myprocedure();
Copy

完全修飾名なしで呼び出された場合、プロシージャと UDFs は、 セッションで使用されているデータベースとスキーマに従って解決されます検索パスを指定 した場合は、その検索パスを使用して 呼び出す関数またはプロシージャを決定 します。

対照的に、Snowflakeが提供する組み込みのシステム定義関数の多くには名前空間がありません。その結果、どこからでも呼び出すことができます。

プロシージャおよび関数のオーバーロード

Snowflakeは プロシージャと関数のオーバーロード をサポートしています。所定のスキーマでは、同じ名前で署名が異なる複数のプロシージャや関数を定義できます。署名は、引数の数、引数の型、またはその両方によって異なる必要があります。

例: UDFs の場合、

CREATE OR REPLACE FUNCTION myudf (number_argument NUMBER) ...
Copy
CREATE OR REPLACE FUNCTION myudf (varchar_argument VARCHAR) ...
Copy
CREATE OR REPLACE FUNCTION myudf (number_argument NUMBER, varchar_argument VARCHAR) ...
Copy

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

CREATE OR REPLACE PROCEDURE myproc (number_argument NUMBER) ...
Copy
CREATE OR REPLACE PROCEDURE myproc (varchar_argument VARCHAR) ...
Copy
CREATE OR REPLACE PROCEDURE myproc (number_argument NUMBER, varchar_argument VARCHAR) ...
Copy

複数の署名が同じ数の引数を使用するが、引数の型が異なる場合は、関数やプロシージャを呼び出すときにどの署名を使用するかを示すために、引数に異なる名前を使用することができます。

CREATE OR REPLACE FUNCTION echo_input (numeric_input NUMBER)
  RETURNS NUMBER
  AS 'numeric_input';
Copy
CREATE OR REPLACE FUNCTION echo_input (varchar_input VARCHAR)
  RETURNS VARCHAR
  AS 'varchar_input';
Copy
SELECT echo_input(numeric_input => 10);
Copy
SELECT echo_input(varchar_input => 'hello world');
Copy

注釈

関数やプロシージャを呼び出すコマンド以外のコマンド(例: DESCRIBE FUNCTIONDROP PROCEDUREGRANT <権限> の実行など)では、引数のデータ型を使って、使用する署名を識別する必要があります。

オーバーロードされたプロシージャおよび関数の呼び出し

他の プロシージャ関数 を呼び出す場合と同様に、引数を名前または位置で指定することができます。

SELECT myudf(text_input => 'hello world');
Copy
SELECT myudf('hello world');
Copy

引数名を省略した場合や、異なる型の引数に同じ引数名を使用した場合、Snowflakeは引数の数と引数の型を使用して、使用する署名を決定します。このような場合、 自動型変換(強制) は、選択される署名に影響を与えることがあります。詳細については、 呼び出す署名の識別を引数データ型に依存する場合についての注意点 をご参照ください。

呼び出す署名の識別を引数データ型に依存する場合についての注意点

呼び出す関数やプロシージャの署名の識別を引数のデータ型(引数名ではなく)に頼っている場合は、自動型変換とオーバーロードの組み合わせにより、ちょっとしたユーザーのミスで予期せぬ結果を招きやすくなることに注意してください。

add5 という名前の2つの SQL UDFs を作成する次の例を検討してください。

CREATE OR REPLACE FUNCTION add5 (n NUMBER)
  RETURNS NUMBER
  AS 'n + 5';

CREATE OR REPLACE FUNCTION add5 (s VARCHAR)
  RETURNS VARCHAR
  AS
  $$
    s || '5'
  $$;
Copy

add5 を呼び出し、引数名なしで数値引数を指定した場合は、最初の実装が呼び出されます。代わりに文字列型の引数を指定すると、2番目の実装が呼び出されます。

引数が数値でも文字列でもない場合、実装は Snowflakeの暗黙的な型変換規則 に依存します。たとえば、 DATE から NUMBER への変換はサポートされていないため、日付型の引数は、文字列に変換されます。その結果、文字列の実装が呼び出されます。

例:

SELECT add5(1);
Copy
+---------+
| ADD5(1) |
|---------|
|       6 |
+---------+
SELECT add5('1');
Copy
+-----------+
| ADD5('1') |
|-----------|
| 15        |
+-----------+
SELECT add5('hello');
Copy
+---------------+
| ADD5('HELLO') |
|---------------|
| hello5        |
+---------------+
SELECT add5(TO_DATE('2014-01-01'));
Copy
+-----------------------------+
| ADD5(TO_DATE('2014-01-01')) |
|-----------------------------|
| 2014-01-015                 |
+-----------------------------+

可能性のある混乱を避けるために、署名ごとに異なる引数名を割り当て、関数を呼び出す際にはその引数名を使用するようにします。

上記の例では、2つの署名は異なる引数名(NUMBER の引数は n、 VARCHAR の引数は s)を使用しています。引数名を指定することで、使用する署名を指定できます。

SELECT add5(n => 1);
Copy
SELECT add5(s => '1');
Copy

検索パスがどの関数またはプロシージャを呼び出すかを決定する方法

検索パスを指定 した場合、検索パスに表示される各スキーマは、検索パスに表示されるスキーマの順序で、一致する関数を検索します。検索された各スキーマの場合、Snowflakeは、必要に応じて暗黙の型変換を使用して、一致する関数の検索を試みます。スキーマに一致するものがない場合は、次のスキーマが検討されます。 add5 関数が、異なるスキーマで定義されているかどうかをもう一度考慮します。

USE SCHEMA s1;
CREATE OR REPLACE FUNCTION add5 ( n number)
  RETURNS number
  AS 'n + 5';
Copy
USE SCHEMA s2;
CREATE OR REPLACE FUNCTION add5 ( s string)
  RETURNS string
  AS 's || ''5''';
Copy

数値や文字列の引数にどの関数を使用するかは、検索パスに依存します。

USE SCHEMA s3;
ALTER SESSION SET SEARCH_PATH='s1,s2';

SELECT add5(5);
Copy
+---------+
| ADD5(5) |
+---------+
| 10      |
+---------+
ALTER SESSION SET SEARCH_PATH='s2,s1';

SELECT add5(5);

+---------+
| ADD5(5) |
*---------+
| 55      |
+---------+
Copy

スキーマ s2 を最初に検索するように検索パスを設定すると、引数に暗黙の型変換を適用する必要があるにもかかわらず、 s2 の関数が使用されます。