프로시저와 UDF의 명명 및 오버로딩

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

저장 프로시저와 UDF를 오버로드하여 지정된 프로시저 또는 함수에 대해 다른 서명을 제공할 수도 있습니다.

참고

사용자 정의 함수 이름의 길이(이름, 반환 유형 및 모든 매개 변수 이름을 합친 길이)는 10,000바이트를 초과할 수 없습니다. 이름이 이 제한을 초과하는 함수를 만들려고 하면 다음 오류 메시지가 발생합니다.

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

프로시저 또는 UDF의 이름 선택하기

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

참고

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

프로시저 또는 UDF 호출하기

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

다음 문에서는 정규화된 이름을 사용하여 저장 프로시저를 호출합니다.

CALL mydatabase.myschema.myprocedure();
Copy

정규화된 이름 없이 호출할 때는 프로시저와 UDF가 세션에 사용 중인 데이터베이스와 스키마에 따라 확인됩니다. 검색 경로를 지정한 경우 해당 검색 경로는 호출할 함수 또는 프로시저를 결정하는 데 사용됩니다.

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

프로시저 및 함수 오버로딩하기

Snowflake는 프로시저 및 함수 오버로딩 을 지원합니다. 지정된 스키마에서 이름은 같지만 서명이 다른 여러 프로시저 또는 함수를 정의할 수 있습니다. 서명은 인자 수, 인자 유형 또는 둘 다에 따라 달라야 합니다.

예를 들면 UDF의 경우 다음과 같습니다.

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 FUNCTION, DROP PROCEDURE, GRANT <권한> 등 실행) 명령 이외의 명령의 경우 사용할 서명을 식별하기 위해 인자의 데이터 타입을 사용해야 합니다.

오버로드된 프로시저 및 함수 호출하기

다른 프로시저 또는 함수 를 호출하는 경우와 마찬가지로, 이름 또는 위치로 인자를 지정할 수 있습니다.

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

인자 이름을 생략하거나 다른 유형의 인자에 대해 동일한 인자 이름을 사용하는 경우 Snowflake는 인자 수와 인자 유형을 사용하여 사용할 서명을 결정합니다. 이러한 경우 자동 유형 변환(강제 변환) 이 선택된 서명에 영향을 줄 수 있습니다. 자세한 내용은 인자 데이터 타입을 사용해 호출할 서명을 식별할 때의 주의 사항 섹션을 참조하십시오.

인자 데이터 타입을 사용해 호출할 서명을 식별할 때의 주의 사항

인자 이름이 아닌 인자의 데이터 타입을 사용하여 호출할 함수 또는 프로시저의 서명을 식별하는 경우 자동 형식 변환과 오버로딩이 합쳐지면 사소한 사용자 오류로 인해 예기치 않은 결과가 발생하기 쉽습니다.

add5 로 명명된 두 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 를 호출하고 인자 이름 없이 숫자형 인자를 지정하면 첫 번째 구현이 호출됩니다. 대신 문자열 형식의 인자를 지정하면 두 번째 구현이 호출됩니다.

인자가 숫자도 문자열도 아닌 경우에는 구현이 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                 |
+-----------------------------+

잠재적 혼동을 방지하려면 서명마다 제각기 다른 인자 이름을 할당하고 함수를 호출할 때 인자 이름을 사용하십시오.

위의 예에서 두 서명은 서로 다른 인자 이름을 사용합니다(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 의 함수가 사용됩니다.