프로시저와 UDF의 명명 규칙¶
저장 프로시저 또는 사용자 정의 함수(UDF)를 생성하거나 호출할 때 Snowflake에서 이들에 대해 허용하고 적용하는 명명 규칙을 알고 있어야 합니다.
프로시저와 UDF의 이름은 오브젝트 식별자 에 대한 규칙을 준수해야 합니다.
이름 양식¶
저장 프로시저 또는 UDF를 생성할 때 지정된 데이터베이스와 스키마에서 생성합니다. 프로시저와 UDF는 db.schema.procedure_or_function_name
형식의 네임스페이스로 정의된 정규화된 이름을 가집니다.
다음은 저장 프로시저 이름의 형식을 보여줍니다.
CALL temporary_db_qualified_names_test.temporary_schema_1.stproc_pi();
정규화된 이름 없이 호출할 때는 프로시저와 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''';중요
두 번째 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 | +-----------------------------+
조심
SQL 이외의 언어로 작성한 UDFs에 대해서는 규칙이 다를 수 있습니다.
UDF 이름 오버로딩의 예¶
다음 예에서는 오버로딩과 자동 형식 변환을 결합하여 예기치 않은 결과를 쉽게 얻을 수 있게 만드는 방법을 보여줍니다.
FLOAT 매개 변수를 받는 함수를 만듭니다.
CREATE FUNCTION add_pi(PARAM_1 FLOAT) RETURNS FLOAT LANGUAGE SQL AS $$ PARAM_1 + 3.1415926::FLOAT $$;
이 함수를 두 번 호출합니다. 처음 호출할 때는 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 | +-------------+---------------+
VARCHAR 매개 변수를 받는 오버로드된 함수를 만듭니다.
CREATE FUNCTION add_pi(PARAM_1 VARCHAR) RETURNS VARCHAR LANGUAGE SQL AS $$ PARAM_1 || ' + 3.1415926' $$;
이전과 동일한 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 | +-------------+-----------------+
저장 프로시저 이름 오버로딩의 예¶
다음 예에서는 오버로딩과 자동 형식 변환을 결합하여 예기치 않은 결과를 쉽게 얻을 수 있게 만드는 방법을 보여줍니다.
이름은 같지만 인자의 개수가 다른 두 저장 프로시저를 만듭니다.
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; $$ ;
두 프로시저를 호출합니다.
call stproc1(5.14::FLOAT); +---------+ | STPROC1 | |---------| | 5.14 | +---------+
call stproc1(5.14::FLOAT, 2.00::FLOAT); +---------+ | STPROC1 | |---------| | 10.28 | +---------+
참고
또한, 저장 프로시저에 대한 일부 다른 작업에 대한 인자의 데이터 타입을 지정해야 합니다. 예를 들어, GRANT 및 REVOKE는 저장 프로시저 이름뿐 아니라 인자 유형도 필요합니다.
다음 오버로딩 예에서는 오버로딩과 자동 형식 변환을 결합하여 예기치 않은 결과를 쉽게 얻을 수 있게 만드는 방법을 보여줍니다.
FLOAT 매개 변수를 받는 저장 프로시저를 만듭니다.
CREATE PROCEDURE add_pi(PARAM_1 FLOAT) RETURNS FLOAT LANGUAGE JAVASCRIPT AS $$ return PARAM_1 + 3.1415926; $$;
저장 프로시저를 두 번 호출합니다. 처음 호출할 때는 FLOAT를 전달합니다. 두 번째로 호출할 때는 VARCHAR를 전달합니다. VARCHAR는 FLOAT로 변환되고, 각 호출에서 출력이 같습니다.
CALL add_pi(1.0); +-----------+ | ADD_PI | |-----------| | 4.1415926 | +-----------+ CALL add_pi('1.0'); +-----------+ | ADD_PI | |-----------| | 4.1415926 | +-----------+
VARCHAR 매개 변수를 받는 오버로드된 저장 프로시저를 만듭니다.
CREATE PROCEDURE add_pi(PARAM_1 VARCHAR) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ return PARAM_1 + '3.1415926'; $$;
이전과 똑같이 저장 프로시저를 호출합니다. 이 두 호출과 이전의 두 호출 사이에서 출력의 차이점에 유의하십시오.
CALL add_pi(1.0); +-----------+ | ADD_PI | |-----------| | 4.1415926 | +-----------+ CALL add_pi('1.0'); +--------------+ | ADD_PI | |--------------| | 1.03.1415926 | +--------------+