プロシージャおよび UDFs の命名規則

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

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

名前の形式

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

以下は、ストアドプロシージャの名前の形式を示しています。

CALL temporary_db_qualified_names_test.temporary_schema_1.stproc_pi();

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

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

オーバーロード

Snowflakeは、プロシージャ名と関数名のオーバーロードをサポートしています。同じスキーマ内の複数のプロシージャまたは関数は、引数の数または引数の種類によって署名が異なる限り、同じ名前を持つことができます。オーバーロードされたプロシージャまたは関数を呼び出すと、Snowflakeは引数を確認し、正しいものを呼び出します。

注釈

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

オーバーロードを使用する場合は注意してください。自動型変換とオーバーロードを組み合わせると、軽微なユーザーエラーによって予期しない結果が引き起こされやすくなります。例については、 ストアドプロシージャ名のオーバーロードの例 をご参照ください。

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

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

CREATE OR REPLACE FUNCTION add5 (s string)
  RETURNS string
  AS 's || ''5''';

重要

2番目のADD5関数では、文字列リテラル '5' をエスケープするために一重引用符が使用されます。UDF定義で使用される一重引用符は、 必ず 一重引用符でエスケープする必要があります。

add5 が数値引数で呼び出された場合、最初の実装が選択され、文字列型の引数は2番目の実装を使用します。引数が数値でも文字列でもない場合、実装はSnowflakeの暗黙的な型変換規則に依存します。例えば、日付型の引数は文字列に変換され、 DATE から NUMBER への変換はサポートされていないため、文字列実装が選択されます。

例:

select add5(1);

+---------+
| ADD5(1) |
|---------|
|       6 |
+---------+

select add5('1');

+-----------+
| ADD5('1') |
|-----------|
| 15        |
+-----------+

select add5('hello');

+---------------+
| ADD5('HELLO') |
|---------------|
| hello5        |
+---------------+

select add5(to_date('2014-01-01'));

+-----------------------------+
| ADD5(TO_DATE('2014-01-01')) |
|-----------------------------|
| 2014-01-015                 |
+-----------------------------+

ご用心

SQL 以外の言語で記述された UDFs の場合は、ルールが異なる可能性があります。

UDF 名のオーバーロードの例

次のオーバーロードの例は、オーバーロードと自動の型変換を組み合わせて、予期しない結果を簡単に得る方法を示しています。

  1. FLOAT パラメーターを受け取る関数を作成します。

    CREATE FUNCTION add_pi(PARAM_1 FLOAT)
        RETURNS FLOAT
        LANGUAGE SQL
        AS $$
            PARAM_1 + 3.1415926::FLOAT
        $$;
    
  2. 関数を2回呼び出します。1回目は、 FLOATを渡します。2回目は、 VARCHARを渡します。 VARCHAR は FLOATに変換され、各呼び出しからの出力は同じです。

    SELECT add_pi(1.0), add_pi('1.0');
    +-------------+---------------+
    | ADD_PI(1.0) | ADD_PI('1.0') |
    |-------------+---------------|
    |   4.1415926 |     4.1415926 |
    +-------------+---------------+
    
  3. VARCHAR パラメーターを受け取るオーバーロード関数を作成します。

    CREATE FUNCTION add_pi(PARAM_1 VARCHAR)
        RETURNS VARCHAR
        LANGUAGE SQL
        AS $$
            PARAM_1 || ' + 3.1415926'
        $$;
    
  4. 前と同じ CALLs を使用します。これら2つの CALLs と前の2つの CALLsの出力の違いに注意してください。

    SELECT add_pi(1.0), add_pi('1.0');
    +-------------+-----------------+
    | ADD_PI(1.0) | ADD_PI('1.0')   |
    |-------------+-----------------|
    |   4.1415926 | 1.0 + 3.1415926 |
    +-------------+-----------------+
    

ストアドプロシージャ名のオーバーロードの例

次のオーバーロードの例は、オーバーロードと自動の型変換を組み合わせて、予期しない結果を簡単に得る方法を示しています。

  1. 名前は同じでも引数の数が異なる2つのストアドプロシージャを作成します。

    create or replace procedure stproc1(FLOAT_PARAM1 FLOAT)
        returns string
        language javascript
        strict
        as
        $$
        return FLOAT_PARAM1;
        $$
        ;
    
    create or replace procedure stproc1(FLOAT_PARAM1 FLOAT, FLOAT_PARAM2 FLOAT)
        returns string
        language javascript
        strict
        as
        $$
        return FLOAT_PARAM1 * FLOAT_PARAM2;
        $$
        ;
    
  2. 2つのプロシージャを呼び出します。

    call stproc1(5.14::FLOAT);
    +---------+
    | STPROC1 |
    |---------|
    | 5.14    |
    +---------+
    
    call stproc1(5.14::FLOAT, 2.00::FLOAT);
    +---------+
    | STPROC1 |
    |---------|
    | 10.28   |
    +---------+
    

注釈

また、ストアドプロシージャに対する他の操作の引数のデータ型を指定する必要があります。例えば、 GRANT および REVOKE には、引数型とストアドプロシージャ名が必要です。

次のオーバーロードの例は、オーバーロードと自動型変換を組み合わせて、予期しない結果を簡単に得る方法を示しています。

  1. FLOAT パラメーターを受け取るストアドプロシージャを作成します。

    CREATE PROCEDURE add_pi(PARAM_1 FLOAT)
        RETURNS FLOAT
        LANGUAGE JAVASCRIPT
        AS $$
            return PARAM_1 + 3.1415926;
        $$;
    
  2. ストアドプロシージャを2回呼び出します。1回目は、 FLOATを渡します。2回目は、 VARCHARを渡します。 VARCHAR は FLOATに変換され、各呼び出しからの出力は同じです。

    CALL add_pi(1.0);
    +-----------+
    |    ADD_PI |
    |-----------|
    | 4.1415926 |
    +-----------+
    CALL add_pi('1.0');
    +-----------+
    |    ADD_PI |
    |-----------|
    | 4.1415926 |
    +-----------+
    
  3. VARCHAR パラメーターを受け取るオーバーロードストアドプロシージャを作成します。

    CREATE PROCEDURE add_pi(PARAM_1 VARCHAR)
        RETURNS VARCHAR
        LANGUAGE JAVASCRIPT
        AS $$
            return PARAM_1 + '3.1415926';
        $$;
    
  4. 前とまったく同じようにストアドプロシージャを呼び出します。これらの呼び出し2つと前の呼び出し2つにおける出力の違いに注意してください。

    CALL add_pi(1.0);
    +-----------+
    |    ADD_PI |
    |-----------|
    | 4.1415926 |
    +-----------+
    CALL add_pi('1.0');
    +--------------+
    | ADD_PI       |
    |--------------|
    | 1.03.1415926 |
    +--------------+