프로시저와 UDF의 명명 규칙

저장 프로시저 또는 사용자 정의 함수(UDF)를 생성하거나 호출할 때 Snowflake에서 이들에 대해 허용하고 적용하는 명명 규칙을 알고 있어야 합니다.

프로시저와 UDF의 이름은 오브젝트 식별자 에 대한 규칙을 준수해야 합니다.

이름 양식

저장 프로시저 또는 UDF를 생성할 때 지정된 데이터베이스와 스키마에서 생성합니다. 프로시저와 UDF는 db.schema.procedure_or_function_name 형식의 네임스페이스로 정의된 정규화된 이름을 가집니다.

다음은 저장 프로시저 이름의 형식을 보여줍니다.

CALL temporary_db_qualified_names_test.temporary_schema_1.stproc_pi();
Copy

정규화된 이름 없이 호출할 때는 프로시저와 UDF가 세션에 사용 중인 데이터베이스와 스키마에 따라 확인됩니다.

반대로, Snowflake에서 기본으로 제공하는 시스템 정의 함수에는 네임스페이스가 없습니다. 따라서 어디서나 시스템 정의 함수를 호출할 수 있습니다.

오버로딩

Snowflake는 프로시저 및 함수 이름의 오버로딩을 지원합니다. 같은 스키마에 있는 여러 프로시저 또는 함수는 서명이 다른 한 인자의 개수나 인자 유형을 기준으로 같은 이름을 가질 수 있습니다. 오버로드된 프로시저나 함수를 호출하면 Snowflake가 인자를 확인하고 올바른 인자를 호출합니다.

참고

Snowflake에서는 시스템 정의 함수와 같은 이름을 가진 함수를 만들 수 없습니다.

오버로딩을 사용할 때는 주의하십시오. 자동 형식 변환과 오버로딩이 합쳐지면 사소한 사용자 오류로 인해 예기치 않은 결과가 발생하기 쉽습니다. 예를 보려면 저장 프로시저 이름 오버로딩의 예 를 참조하십시오.

add5 로 명명된 두 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''';
Copy

중요

두 번째 ADD5 함수에서 작은따옴표는 문자열 리터럴 '5' 를 이스케이프하는 데 사용됩니다. UDF 정의에 사용되는 작은따옴표는 모두 작은따옴표로 이스케이프 해야 합니다.

add5 를 숫자 인자와 함께 호출하는 경우에는 첫 번째 구현을 선택하는 반면, 문자열 형식의 인자는 두 번째 구현을 사용합니다. 인자가 숫자도 문자열도 아닌 경우에는 구현이 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                 |
+-----------------------------+
Copy

조심

SQL 이외의 언어로 작성한 UDFs에 대해서는 규칙이 다를 수 있습니다.

UDF 이름 오버로딩의 예

다음 예에서는 오버로딩과 자동 형식 변환을 결합하여 예기치 않은 결과를 쉽게 얻을 수 있게 만드는 방법을 보여줍니다.

  1. FLOAT 매개 변수를 받는 함수를 만듭니다.

    CREATE FUNCTION add_pi(PARAM_1 FLOAT)
        RETURNS FLOAT
        LANGUAGE SQL
        AS $$
            PARAM_1 + 3.1415926::FLOAT
        $$;
    
    Copy
  2. 이 함수를 두 번 호출합니다. 처음 호출할 때는 FLOAT를 전달합니다. 두 번째로 호출할 때는 VARCHAR를 전달합니다. VARCHAR는 FLOAT로 변환되고, 각 호출에서 출력이 같습니다.

    SELECT add_pi(1.0), add_pi('1.0');
    +-------------+---------------+
    | ADD_PI(1.0) | ADD_PI('1.0') |
    |-------------+---------------|
    |   4.1415926 |     4.1415926 |
    +-------------+---------------+
    
    Copy
  3. VARCHAR 매개 변수를 받는 오버로드된 함수를 만듭니다.

    CREATE FUNCTION add_pi(PARAM_1 VARCHAR)
        RETURNS VARCHAR
        LANGUAGE SQL
        AS $$
            PARAM_1 || ' + 3.1415926'
        $$;
    
    Copy
  4. 이전과 동일한 CALL을 사용합니다. 이 두 개의 CALLs과 이전의 두 CALLs 사이에서 출력의 차이점에 유의하십시오.

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

저장 프로시저 이름 오버로딩의 예

다음 예에서는 오버로딩과 자동 형식 변환을 결합하여 예기치 않은 결과를 쉽게 얻을 수 있게 만드는 방법을 보여줍니다.

  1. 이름은 같지만 인자의 개수가 다른 두 저장 프로시저를 만듭니다.

    create or replace procedure stproc1(FLOAT_PARAM1 FLOAT)
        returns string
        language javascript
        strict
        as
        $$
        return FLOAT_PARAM1;
        $$
        ;
    
    Copy
    create or replace procedure stproc1(FLOAT_PARAM1 FLOAT, FLOAT_PARAM2 FLOAT)
        returns string
        language javascript
        strict
        as
        $$
        return FLOAT_PARAM1 * FLOAT_PARAM2;
        $$
        ;
    
    Copy
  2. 두 프로시저를 호출합니다.

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

참고

또한, 저장 프로시저에 대한 일부 다른 작업에 대한 인자의 데이터 타입을 지정해야 합니다. 예를 들어, GRANT 및 REVOKE는 저장 프로시저 이름뿐 아니라 인자 유형도 필요합니다.

다음 오버로딩 예에서는 오버로딩과 자동 형식 변환을 결합하여 예기치 않은 결과를 쉽게 얻을 수 있게 만드는 방법을 보여줍니다.

  1. FLOAT 매개 변수를 받는 저장 프로시저를 만듭니다.

    CREATE PROCEDURE add_pi(PARAM_1 FLOAT)
        RETURNS FLOAT
        LANGUAGE JAVASCRIPT
        AS $$
            return PARAM_1 + 3.1415926;
        $$;
    
    Copy
  2. 저장 프로시저를 두 번 호출합니다. 처음 호출할 때는 FLOAT를 전달합니다. 두 번째로 호출할 때는 VARCHAR를 전달합니다. VARCHAR는 FLOAT로 변환되고, 각 호출에서 출력이 같습니다.

    CALL add_pi(1.0);
    +-----------+
    |    ADD_PI |
    |-----------|
    | 4.1415926 |
    +-----------+
    CALL add_pi('1.0');
    +-----------+
    |    ADD_PI |
    |-----------|
    | 4.1415926 |
    +-----------+
    
    Copy
  3. VARCHAR 매개 변수를 받는 오버로드된 저장 프로시저를 만듭니다.

    CREATE PROCEDURE add_pi(PARAM_1 VARCHAR)
        RETURNS VARCHAR
        LANGUAGE JAVASCRIPT
        AS $$
            return PARAM_1 + '3.1415926';
        $$;
    
    Copy
  4. 이전과 똑같이 저장 프로시저를 호출합니다. 이 두 호출과 이전의 두 호출 사이에서 출력의 차이점에 유의하십시오.

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