CREATE PROCEDURE¶
새 저장 프로시저 를 만듭니다.
프로시저는 다음 언어 중 하나로 작성할 수 있습니다.
참고
(저장되지 않고) 익명인 프로시저를 만들고 호출하려면 CALL(익명 프로시저 사용) 를 사용하십시오. 익명 프로시저를 만드는 데는 CREATE PROCEDURE 스키마 권한이 있는 역할이 필요하지 않습니다.
구문¶
Java 처리기¶
처리기 코드 인라인을 포함하거나 JAR 파일에서 해당 처리기 코드를 참조하는 저장 프로시저를 만들 수 있습니다. 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
인라인 저장 프로시저의 경우 다음 구문을 사용합니다.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <defaut_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE JAVA
RUNTIME_VERSION = '<java_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
AS '<procedure_definition>'
미리 컴파일된 처리기를 사용하는 저장 프로시저의 경우 다음 구문을 사용합니다.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE JAVA
RUNTIME_VERSION = '<java_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
JavaScript 처리기¶
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS <result_data_type> [ NOT NULL ]
LANGUAGE JAVASCRIPT
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
AS '<procedure_definition>'
중요
JavaScript는 대/소문자를 구분하는 반면, SQL은 대/소문자를 구분하지 않습니다. JavaScript 코드에서 저장 프로시저 인자 이름을 사용하는 방법에 대한 중요한 정보는 JavaScript 인자의 대/소문자 구분 섹션을 참조하십시오.
Python 처리기¶
인라인 저장 프로시저의 경우 다음 구문을 사용합니다.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE PYTHON
RUNTIME_VERSION = '<python_version>'
PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]' ... ])
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<function_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
AS '<procedure_definition>'
코드가 스테이지의 파일에 있는 저장 프로시저의 경우 다음 구문을 사용하십시오.
CREATE [ OR REPLACE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE PYTHON
RUNTIME_VERSION = '<python_version>'
PACKAGES = ( 'snowflake-snowpark-python[==<version>]'[, '<package_name>[==<version>]' ... ])
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<module_file_name>.<function_name>'
[ EXTERNAL_ACCESS_INTEGRATIONS = ( <name_of_integration> [ , ... ] ) ]
[ SECRETS = ('<secret_variable_name>' = <secret_name> [ , ... ] ) ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
Scala 처리기¶
처리기 코드 인라인을 포함하거나 JAR 파일에서 해당 처리기 코드를 참조하는 저장 프로시저를 만들 수 있습니다. 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
인라인 저장 프로시저의 경우 다음 구문을 사용합니다.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE SCALA
RUNTIME_VERSION = '<scala_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ TARGET_PATH = '<stage_path_and_file_name_to_write>' ]
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
AS '<procedure_definition>'
미리 컴파일된 처리기를 사용하는 저장 프로시저의 경우 다음 구문을 사용합니다.
CREATE [ OR REPLACE ] [ SECURE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> [ [ NOT ] NULL ] | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
LANGUAGE SCALA
RUNTIME_VERSION = '<scala_runtime_version>'
PACKAGES = ( 'com.snowflake:snowpark:<version>' [, '<package_name_and_version>' ...] )
[ IMPORTS = ( '<stage_path_and_file_name_to_read>' [, '<stage_path_and_file_name_to_read>' ...] ) ]
HANDLER = '<fully_qualified_method_name>'
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ VOLATILE | IMMUTABLE ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
Snowflake Scripting 처리기¶
CREATE [ OR REPLACE ] PROCEDURE <name> (
[ <arg_name> <arg_data_type> [ DEFAULT <default_value> ] ] [ , ... ] )
[ COPY GRANTS ]
RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
[ NOT NULL ]
LANGUAGE SQL
[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
[ { VOLATILE | IMMUTABLE } ] -- Note: VOLATILE and IMMUTABLE are deprecated.
[ COMMENT = '<string_literal>' ]
[ EXECUTE AS { CALLER | OWNER } ]
AS <procedure_definition>
참고
SnowSQL 또는 Classic Console 에서 Snowflake Scripting 프로시저를 생성하는 경우 procedure definition
주위에 문자열 리터럴 구분 기호 ('
또는 $$
)를 사용해야 합니다. SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 섹션을 참조하십시오.
필수 매개 변수¶
모든 언어¶
name ( [ arg_name arg_data_type [ DEFAULT default_value ] ] [ , ... ] )
저장 프로시저에 대한 식별자(
name
), 입력 인자, 선택적 인자의 기본값을 지정합니다.식별자의 경우:
저장 프로시저는 이름과 인자 타입의 조합으로 식별 및 확인 되기 때문에 식별자는 프로시저가 생성되는 스키마에 대해 고유할 필요가 없습니다.
식별자는 알파벳 문자로 시작해야 하며 전체 식별자 문자열을 큰따옴표(예: “My object”)로 묶지 않는 한 공백이나 특수 문자를 포함할 수 없습니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다. 식별자 요구 사항 섹션을 참조하십시오.
입력 인자의 경우:
arg_name
의 경우, 입력 인자의 이름을 지정합니다.arg_data_type
의 경우, 사용 중인 언어에 해당하는 Snowflake 데이터 타입을 사용합니다.Java 저장 프로시저 의 경우 SQL-Java 데이터 타입 매핑 섹션을 참조하십시오.
JavaScript 저장 프로시저 의 경우, SQL 및 JavaScript 데이터 타입 매핑 섹션을 참조하십시오.
Python 저장 프로시저 의 경우 SQL-Python 데이터 타입 매핑 섹션을 참조하십시오.
Scala 저장 프로시저 의 경우 SQL-Scala 데이터 타입 매핑 섹션을 참조하십시오.
Snowflake Scripting의 경우 SQL 데이터 타입.
참고
(Snowpark API를 사용하는) Java, Python 또는 Scala로 작성하는 저장 프로시저의 경우 Snowpark
Session
오브젝트의 인자를 생략하십시오.Session
인자는 CREATE PROCEDURE 또는 CALL에서 지정하는 형식 매개 변수가 아닙니다. 저장 프로시저를 호출하면 Snowflake는 자동으로Session
오브젝트를 만들어 저장 프로시저에 대한 핸들러 함수에 전달합니다.인자가 선택 사항임을 나타내려면
DEFAULT default_value
를 사용하여 인자의 기본값을 지정하십시오. 기본값에는 리터럴이나 식을 사용할 수 있습니다.선택적 인자를 지정하는 경우 필수 인자 뒤에 배치해야 합니다.
프로시저에 선택적 인자가 있는 경우 이름은 동일하고 서명은 다른 추가 프로시저를 정의할 수 없습니다.
자세한 내용은 선택적 인자 지정하기 섹션을 참조하십시오.
RETURNS result_data_type [ NOT NULL ]
저장 프로시저에서 반환된 결과 타입을 지정합니다.
result_data_type
의 경우, 사용 중인 언어의 타입에 해당하는 Snowflake 데이터 타입을 사용합니다.Java 저장 프로시저 의 경우 SQL-Java 데이터 타입 매핑 섹션을 참조하십시오.
JavaScript 저장 프로시저 의 경우, SQL 및 JavaScript 데이터 타입 매핑 섹션을 참조하십시오.
Python 저장 프로시저 의 경우 SQL-Python 데이터 타입 매핑 섹션을 참조하십시오.
Scala 저장 프로시저 의 경우 SQL-Scala 데이터 타입 매핑 섹션을 참조하십시오.
Snowflake Scripting의 경우 SQL 데이터 타입.
참고
Snowpark(Java 또는 Scala)에서 작성하는 저장 프로시저에는 반환 값이 있어야 합니다. Snowpark(Python)에서 저장 프로시저가 아무런 값도 반환하지 않으면
None
을 반환하는 것으로 간주됩니다. 프로시저가 명시적으로 아무 것도 반환하지 않더라도 모든 CREATE PROCEDURE 문에는 반환 타입을 정의하는 RETURNS 절이 포함되어야 합니다.RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] )
의 경우 반환된 테이블에 있는 열의 Snowflake 데이터 타입 을 알면 열 이름과 유형을 지정하십시오.CREATE OR REPLACE PROCEDURE get_top_sales() RETURNS TABLE (sales_date DATE, quantity NUMBER) ...
그렇지 않으면(예: 런타임 중에 열 유형을 결정하는 경우) 열 이름과 유형을 생략할 수 있습니다.
CREATE OR REPLACE PROCEDURE get_top_sales() RETURNS TABLE ()
참고
현재,
RETURNS TABLE(...)
절에서는 GEOGRAPHY를 열 유형으로 지정할 수 없습니다. 이는 저장 프로시저를 생성하든 익명 프로시저를 생성하든 관계없이 적용됩니다.CREATE OR REPLACE PROCEDURE test_return_geography_table_1() RETURNS TABLE(g GEOGRAPHY) ...
WITH test_return_geography_table_1() AS PROCEDURE RETURNS TABLE(g GEOGRAPHY) ... CALL test_return_geography_table_1();
GEOGRAPHY를 열 유형으로 지정하려고 할 경우 저장 프로시저를 호출하면 오류가 발생합니다.
Stored procedure execution error: data type of returned table does not match expected returned table type
이 문제를 해결하려면
RETURNS TABLE()
에서 열 인자와 유형을 생략하면 됩니다.CREATE OR REPLACE PROCEDURE test_return_geography_table_1() RETURNS TABLE() ...
WITH test_return_geography_table_1() AS PROCEDURE RETURNS TABLE() ... CALL test_return_geography_table_1();
RETURNS TABLE(…)은 처리기가 다음 언어로 작성된 경우에만 지원됩니다.
실제로는, Snowflake Scripting 블록 외부에서는 호출이 식의 일부가 될 수 없으므로 반환된 값을 사용할 수 없습니다.
LANGUAGE language
저장 프로시저 코드의 언어를 지정합니다. 이는 Snowflake Scripting 으로 작성된 저장 프로시저의 경우 선택 사항입니다.
현재, 지원되는
language
값은 다음과 같습니다.JAVA
(Java 용)JAVASCRIPT
(JavaScript 용)PYTHON
(Python 용)SCALA
(Scala 용)SQL
(Snowflake Scripting 의 경우)
기본값:
SQL
.AS procedure_definition
저장 프로시저에 의해 실행되는 코드를 정의합니다. 정의는 어떤 유효한 코드로든 구성될 수 있습니다.
다음 사항을 참고하십시오.
코드가 인라인이 아닌 저장 프로시저의 경우 AS 절을 생략합니다. 여기에는 스테이징된 처리기가 있는 저장 프로시저가 포함됩니다.
대신 IMPORTS 절을 사용하여 저장 프로시저에 대한 코드가 포함된 파일의 위치를 지정하십시오. 자세한 내용은 다음을 참조하십시오.
인라인 및 스테이징된 처리기에 대한 자세한 내용은 처리기 코드를 인라인 또는 스테이지에 유지하기 섹션을 참조하십시오.
다음의 경우에는
procedure definition
주위에 문자열 구분 기호 ('
또는$$
)를 사용해야 합니다.Snowflake Scripting 이외의 언어를 사용 중인 경우.
SnowSQL 또는 Classic Console 에서 Snowflake Scripting 프로시저를 생성 중인 경우. SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 섹션을 참조하십시오.
JavaScript로 저장 프로시저를 작성하고, 줄 바꿈을 포함하는 문자열을 작성하는 경우, 문자열 주위에 역따옴표(“억음 부호”라고도 함)를 사용할 수 있습니다.
JavaScript 저장 프로시저의 다음 예에서는 저장 프로시저의 본문에 작은따옴표와 큰따옴표가 포함되어 있으므로
$$
및 역따옴표를 사용합니다.CREATE OR REPLACE TABLE table1 ("column 1" VARCHAR);
CREATE or replace PROCEDURE proc3() RETURNS VARCHAR LANGUAGE javascript AS $$ var rs = snowflake.execute( { sqlText: `INSERT INTO table1 ("column 1") SELECT 'value 1' AS "column 1" ;` } ); return 'Done.'; $$;
Snowflake Scripting 이외의 언어의 경우 Snowflake는 CREATE PROCEDURE 명령을 실행할 때 코드의 유효성을 완전히 검증하지는 않습니다.
예를 들어 Snowpark(Scala) 저장 프로시저의 경우 입력 인자의 수와 타입은 검증되지만, 함수 본문은 검증되지 않습니다. 숫자 또는 타입이 일치하지 않는 경우(예: 인자가 숫자가 아닌 타입일 때 Snowflake 데이터 타입 NUMBER가 사용되는 경우) CREATE PROCEDURE 명령을 실행하면 오류가 발생합니다.
코드가 유효하지 않으면 CREATE PROCEDURE 명령이 성공하고, 저장 프로시저가 호출될 때 오류가 반환됩니다.
저장 프로시저에 대한 자세한 내용은 저장 프로시저 작업하기 섹션을 참조하십시오.
Java¶
RUNTIME_VERSION = 'language_runtime_version'
사용할 언어 런타임 버전입니다. 현재 지원되는 버전은 다음과 같습니다.
11
PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )
Snowflake에 배포되어 처리기 코드의 실행 환경에 포함해야 하는 패키지의 이름이 수록된 쉼표로 구분된 목록입니다. Snowpark 패키지는 저장 프로시저에 필수적이므로, PACKAGES 절에서 항상 참조해야 합니다. Snowpark에 대한 자세한 내용은 Snowpark API 섹션을 참조하십시오.
기본적으로, Snowflake가 저장 프로시저를 실행하는 환경에는 지원되는 언어용으로 선택된 패키지 세트가 포함됩니다. PACKAGES 절에서 이러한 패키지를 참조할 때 Snowflake에서 해당 패키지를 이미 제공하므로 IMPORTS 절에 패키지가 포함된 파일을 참조할 필요가 없습니다. 패키지 버전을 지정할 수도 있습니다.
Java용으로 지원되는 패키지 및 버전 목록을 보려면 INFORMATION_SCHEMA.PACKAGES 뷰 에서 언어를 지정하는 행을 쿼리하십시오. 예:
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'java';
패키지 이름과 버전 번호를 지정하려면 다음 형식을 사용하십시오.
domain:package_name:version
최신 버전을 지정하려면
version
에 대해latest
를 지정하십시오.예를 들어 Snowflake에 최신 Snowpark 라이브러리의 패키지를 포함하려면 다음을 사용하십시오.
PACKAGES = ('com.snowflake:snowpark:latest')
Snowpark 라이브러리에서 패키지를 지정할 때 버전 1.3.0 이상을 지정해야 합니다.
HANDLER = 'fully_qualified_method_name'
저장 프로시저에 대한 메서드 또는 함수의 정규화된 이름을 사용합니다. 이것은 일반적으로 다음과 같은 형식입니다.
com.my_company.my_package.MyClass.myMethod
여기서,
com.my_company.my_package
오브젝트 또는 클래스를 포함하는 패키지에 해당합니다.
package com.my_company.my_package;
Python¶
RUNTIME_VERSION = 'language_runtime_version'
사용할 언어 런타임 버전입니다. 현재 지원되는 버전은 다음과 같습니다.
3.8
3.9
3.10
3.11
PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )
Snowflake에 배포되어 처리기 코드의 실행 환경에 포함해야 하는 패키지의 이름이 수록된 쉼표로 구분된 목록입니다. Snowpark 패키지는 저장 프로시저에 필수적이므로, PACKAGES 절에서 항상 참조해야 합니다. Snowpark에 대한 자세한 내용은 Snowpark API 섹션을 참조하십시오.
기본적으로, Snowflake가 저장 프로시저를 실행하는 환경에는 지원되는 언어용으로 선택된 패키지 세트가 포함됩니다. PACKAGES 절에서 이러한 패키지를 참조할 때 Snowflake에서 해당 패키지를 이미 제공하므로 IMPORTS 절에 패키지가 포함된 파일을 참조할 필요가 없습니다. 패키지 버전을 지정할 수도 있습니다.
Python용으로 지원되는 패키지 및 버전 목록을 보려면 INFORMATION_SCHEMA.PACKAGES 뷰 에서 언어를 지정하는 행을 쿼리하십시오. 예:
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'python';
Snowflake에는 Anaconda를 통해 구할 수 있는 패키지가 다수 포함되어 있습니다. 서드 파티 패키지 사용하기 섹션을 참조하십시오.
패키지 이름과 버전 번호를 지정하려면 다음 형식을 사용하십시오.
package_name[==version]
최신 버전을 지정하려면 버전 번호를 생략하십시오.
예를 들어, (필요한 Snowpark 패키지의 최신 버전과 함께) spacy 패키지 버전 2.3.5를 포함하려면 다음을 사용하십시오.
PACKAGES = ('snowflake-snowpark-python', 'spacy==2.3.5')
Snowpark 라이브러리에서 패키지를 지정할 때 버전 0.4.0 이상을 지정해야 합니다. Snowflake에서 사용 가능한 최신 버전을 사용하려면 버전 번호를 생략하십시오.
HANDLER = 'fully_qualified_method_name'
저장 프로시저의 함수 또는 메서드의 이름을 사용합니다. 이는 코드가 인라인인지, 또는 스테이지에서 참조되는지에 따라 다를 수 있습니다.
코드가 인라인이면 다음 예제에서처럼 함수 이름만 지정할 수 있습니다.
CREATE OR REPLACE PROCEDURE MYPROC(from_table STRING, to_table STRING, count INT) ... HANDLER = 'run' AS $$ def run(session, from_table, to_table, count): ... $$;
코드를 스테이지에서 가져올 때 정규화된 핸들러 함수 이름을
<모듈_이름>.<함수_이름>
으로 지정합니다.CREATE OR REPLACE PROCEDURE MYPROC(from_table STRING, to_table STRING, count INT) ... IMPORTS = ('@mystage/my_py_file.py') HANDLER = 'my_py_file.run';
Scala¶
RUNTIME_VERSION = 'language_runtime_version'
사용할 언어 런타임 버전입니다. 현재 지원되는 버전은 다음과 같습니다.
2.12
PACKAGES = ( 'snowpark_package_name' [, 'package_name' ...] )
Snowflake에 배포되어 처리기 코드의 실행 환경에 포함해야 하는 패키지의 이름이 수록된 쉼표로 구분된 목록입니다. Snowpark 패키지는 저장 프로시저에 필수적이므로, PACKAGES 절에서 항상 참조해야 합니다. Snowpark에 대한 자세한 내용은 Snowpark API 섹션을 참조하십시오.
기본적으로, Snowflake가 저장 프로시저를 실행하는 환경에는 지원되는 언어용으로 선택된 패키지 세트가 포함됩니다. PACKAGES 절에서 이러한 패키지를 참조할 때 Snowflake에서 해당 패키지를 이미 제공하므로 IMPORTS 절에 패키지가 포함된 파일을 참조할 필요가 없습니다. 패키지 버전을 지정할 수도 있습니다.
Scala용으로 지원되는 패키지 및 버전 목록을 보려면 INFORMATION_SCHEMA.PACKAGES 뷰 에서 언어를 지정하는 행을 쿼리하십시오. 예:
SELECT * FROM INFORMATION_SCHEMA.PACKAGES WHERE LANGUAGE = 'scala';
패키지 이름과 버전 번호를 지정하려면 다음 형식을 사용하십시오.
domain:package_name:version
최신 버전을 지정하려면
version
에 대해latest
를 지정하십시오.예를 들어 Snowflake에 최신 Snowpark 라이브러리의 패키지를 포함하려면 다음을 사용하십시오.
PACKAGES = ('com.snowflake:snowpark:latest')
Snowflake는 Scala 저장 프로시저에서 Snowpark 버전 0.9.0 이상 사용을 지원합니다. 그러나 이러한 버전에는 제한 사항이 있습니다. 예를 들어 1.1.0 이전 버전은 저장 프로시저에서 트랜잭션 사용을 지원하지 않습니다.
HANDLER = 'fully_qualified_method_name'
저장 프로시저에 대한 메서드 또는 함수의 정규화된 이름을 사용합니다. 이것은 일반적으로 다음과 같은 형식입니다.
com.my_company.my_package.MyClass.myMethod
여기서,
com.my_company.my_package
오브젝트 또는 클래스를 포함하는 패키지에 해당합니다.
package com.my_company.my_package;
선택적 매개 변수¶
모든 언어¶
SECURE
프로시저가 안전한 것으로 지정합니다. 보안 프로시저에 대한 자세한 내용은 Secure UDF와 저장 프로시저로 민감한 정보 보호하기 섹션을 참조하십시오.
[ [ NOT ] NULL ]
저장 프로시저가 NULL 값을 반환할 수 있는지, 아니면 NULL이 아닌 값만 반환해야 하는지 여부를 지정합니다.
기본값은 NULL입니다(즉, 저장 프로시저가 NULL을 반환할 수 있음).
CALLED ON NULL INPUT
또는 .{ RETURNS NULL ON NULL INPUT | STRICT }
null 입력으로 호출 시 저장 프로시저의 동작을 지정합니다. 입력값이 null일 때 항상 null을 반환하는 시스템 정의 함수와는 반대로, 저장 프로시저는 null 입력을 처리하여 입력값이 null일 때도 null이 아닌 값을 반환할 수 있습니다.
CALLED ON NULL INPUT
은 항상 null 입력으로 저장 프로시저를 호출합니다. 그와 같은 값을 적절히 처리하는 것은 프로시저에 달려 있습니다.RETURNS NULL ON NULL INPUT
(또는 동의어STRICT
)은 입력값이 null인 경우 저장 프로시저를 호출하지 않으므로, 저장 프로시저 내의 문이 실행되지 않습니다. 대신, 항상 null 값이 반환됩니다. 프로시저는 null이 아닌 입력값에 대해 여전히 null을 반환할 수도 있습니다.
기본값:
CALLED ON NULL INPUT
VOLATILE | IMMUTABLE
사용되지 않음
주의
이러한 키워드는 저장 프로시저에 더 이상 사용되지 않습니다. 이러한 키워드의 목적은 저장 프로시저에 적용하는 것이 아닙니다. 향후 릴리스에서는 설명서에서 이러한 키워드를 제거할 예정입니다.
COMMENT = 'string_literal'
SHOW PROCEDURES 출력의 DESCRIPTION 열에 표시되는 저장 프로시저에 대한 설명을 지정합니다.
기본값:
stored procedure
EXECUTE AS CALLER
또는 .EXECUTE AS OWNER
저장 프로시저가 소유자의 권한(“소유자 권한” 저장 프로시저)으로 실행되는지, 아니면 호출자의 권한(“호출자 권한” 저장 프로시저)으로 실행되는지 지정합니다.
CREATE PROCEDURE … EXECUTE AS CALLER 문을 실행하면 나중에 프로시저가 호출자의 권한 프로시저로 실행됩니다.
CREATE PROCEDURE … EXECUTE AS OWNER를 실행하면 프로시저가 소유자의 권한 프로시저로 실행됩니다.
기본적으로(프로시저 생성 시 OWNER도, CALLER도 명시적으로 지정하지 않은 경우), 이 프로시저는 소유자의 권한 저장 프로시저로 실행됩니다.
소유자의 권한 저장 프로시저는 호출자의 환경(예: 호출자의 세션 변수)에 대한 액세스 권한이 적고, Snowflake는 기본적으로 이처럼 더 높은 수준의 개인정보 보호 및 보안을 적용합니다.
자세한 내용은 Understanding Caller’s Rights and Owner’s Rights Stored Procedures 섹션을 참조하십시오.
기본값:
OWNER
COPY GRANTS
CREATE OR REPLACE PROCEDURE를 사용하여 새 프로시저를 만들 때 원래 프로시저의 액세스 권한을 유지하도록 지정합니다.
이 매개 변수는 OWNERSHIP을 제외한 모든 권한을 기존 프로시저에서 새 프로시저로 복사합니다. 새 프로시저는 스키마의 오브젝트 유형에 대해 정의된 향후 모든 권한 부여를 상속합니다. 기본적으로, CREATE PROCEDURE 문을 실행하는 역할은 새 프로시저를 소유합니다.
참고:
대체 프로시저에 대한 SHOW GRANTS 출력에는 CREATE PROCEDURE 문이 실행될 때 현재 타임스탬프를 포함한 이 문을 실행한 역할로서 복사된 권한의 피부여자가 나열됩니다.
권한 부여 복사 작업은 CREATE PROCEDURE 명령에서 원자적으로(즉, 같은 트랜잭션 내에서) 발생합니다.
Java¶
IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )
가져올 파일의 위치(스테이지), 경로, 이름입니다. 저장 프로시저가 의존하는 모든 파일을 포함하도록 IMPORTS 절을 설정해야 합니다.
인라인 저장 프로시저를 작성하는 경우, 코드가 저장 프로시저 또는 리소스 파일 외부에 정의된 클래스에 종속되지 않는 한 이 절을 생략할 수 있습니다.
스테이징된 처리기가 있는 저장 프로시저를 작성하는 경우 저장 프로시저의 처리기 코드가 포함된 JAR 파일의 경로도 포함해야 합니다.
IMPORTS 정의는 저장 프로시저로 전달되는 인자의 변수를 참조할 수 없습니다.
파일이 다른 하위 디렉터리나 다른 스테이지에 있더라도 IMPORTS 절의 각 파일은 고유한 이름을 가져야 합니다.
TARGET_PATH = 'stage_path_and_file_name_to_write'
인라인 처리기 코드를 사용하는 저장 프로시저의 경우
procedure_definition
에 지정된 소스 코드를 컴파일한 후 Snowflake가 컴파일된 코드(JAR 파일)를 작성해야 하는 위치를 지정합니다. 이 절을 생략할 경우 Snowflake는 코드가 필요할 때마다 소스 코드를 다시 컴파일합니다.이 절을 지정하는 경우:
이를 기존 파일로 설정할 수 없습니다. TARGET_PATH 가 기존 파일을 가리키는 경우 Snowflake는 오류를 반환합니다.
IMPORTS 및 TARGET_PATH 절을 둘 다 지정하는 경우, 파일이 다른 하위 디렉터리 또는 다른 스테이지에 있더라도 IMPORTS 절의 파일 이름은 TARGET_PATH 절의 각 파일 이름과 달라야 합니다.
더 이상 저장 프로시저를 사용할 필요가 없으면(예: 저장 프로시저를 삭제한 경우) 이 JAR 파일을 수동으로 제거해야 합니다.
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
이 프로시저의 처리기 코드가 외부 네트워크에 액세스하려면 필요한 외부 액세스 통합 의 이름입니다.
외부 액세스 통합에는 처리기 코드가 외부 네트워크(예: 외부REST API)를 요청하는 데 필요한 외부 위치와 자격 증명(있는 경우)을 지정하는 네트워크 규칙 및 시크릿 이 포함됩니다.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
처리기 코드의 시크릿에서 정보를 검색할 때 변수를 사용하여 시크릿을 참조할 수 있도록 시크릿 이름을 변수에 할당합니다.
이 매개 변수의 값은 다음 부분을 포함한 할당 식의 쉼표로 구분된 목록입니다.
외부 액세스 통합의 ALLOWED_AUTHENTICATION_SECRETS 매개 변수 값에 지정된 시크릿의 이름인
secret_name
. 결국, 해당 외부 액세스 통합의 이름은 이 CREATE PROCEDURE 호출의 EXTERNAL_ACCESS_INTEGRATIONS 매개 변수 값으로 지정해야 합니다.EXTERNAL_ACCESS_INTEGRATIONS 매개 변수로 지정된 통합에도 시크릿이 포함되지 않은 SECRETS 값을 지정하면 오류가 발생합니다.
시크릿에서 정보를 검색할 때 처리기 코드에서 사용할 변수인
'secret_variable_name'
.
예를 포함한 자세한 내용은 함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오.
Python¶
IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )
가져올 파일의 위치(스테이지), 경로, 이름입니다. 저장 프로시저가 의존하는 모든 파일을 포함하도록 IMPORTS 절을 설정해야 합니다.
인라인 저장 프로시저를 작성하는 경우, 코드가 저장 프로시저 또는 리소스 파일 외부에 정의된 클래스에 종속되지 않는 한 이 절을 생략할 수 있습니다.
저장 프로시저의 코드가 스테이지에 있을 경우 코드가 있는 모듈 파일의 경로도 포함해야 합니다.
IMPORTS 정의는 저장 프로시저로 전달되는 인자의 변수를 참조할 수 없습니다.
파일이 다른 하위 디렉터리나 다른 스테이지에 있더라도 IMPORTS 절의 각 파일은 고유한 이름을 가져야 합니다.
EXTERNAL_ACCESS_INTEGRATIONS = ( integration_name [ , ... ] )
이 프로시저의 처리기 코드가 외부 네트워크에 액세스하려면 필요한 외부 액세스 통합 의 이름입니다.
외부 액세스 통합에는 처리기 코드가 외부 네트워크(예: 외부REST API)를 요청하는 데 필요한 외부 위치와 자격 증명(있는 경우)을 지정하는 네트워크 규칙 및 시크릿 이 포함됩니다.
SECRETS = ( 'secret_variable_name' = secret_name [ , ... ] )
처리기 코드의 시크릿에서 정보를 검색할 때 변수를 사용하여 시크릿을 참조할 수 있도록 시크릿 이름을 변수에 할당합니다.
이 매개 변수의 값은 다음 부분을 포함한 할당 식의 쉼표로 구분된 목록입니다.
외부 액세스 통합의 ALLOWED_AUTHENTICATION_SECRETS 매개 변수 값에 지정된 시크릿의 이름인
secret_name
. 결국, 해당 외부 액세스 통합의 이름은 이 CREATE PROCEDURE 호출의 EXTERNAL_ACCESS_INTEGRATIONS 매개 변수 값으로 지정해야 합니다.EXTERNAL_ACCESS_INTEGRATIONS 매개 변수로 지정된 통합에도 시크릿이 포함되지 않은 SECRETS 값을 지정하면 오류가 발생합니다.
시크릿에서 정보를 검색할 때 처리기 코드에서 사용할 변수인
'secret_variable_name'
.
예를 포함한 자세한 내용은 함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오.
Scala¶
IMPORTS = ( 'stage_path_and_file_name_to_read' [, 'stage_path_and_file_name_to_read' ...] )
가져올 파일의 위치(스테이지), 경로, 이름입니다. 저장 프로시저가 의존하는 모든 파일을 포함하도록 IMPORTS 절을 설정해야 합니다.
인라인 저장 프로시저를 작성하는 경우, 코드가 저장 프로시저 또는 리소스 파일 외부에 정의된 클래스에 종속되지 않는 한 이 절을 생략할 수 있습니다.
스테이징된 처리기가 있는 저장 프로시저를 작성하는 경우 저장 프로시저의 처리기 코드가 포함된 JAR 파일의 경로도 포함해야 합니다.
IMPORTS 정의는 저장 프로시저로 전달되는 인자의 변수를 참조할 수 없습니다.
파일이 다른 하위 디렉터리나 다른 스테이지에 있더라도 IMPORTS 절의 각 파일은 고유한 이름을 가져야 합니다.
TARGET_PATH = 'stage_path_and_file_name_to_write'
인라인 처리기 코드를 사용하는 저장 프로시저의 경우
procedure_definition
에 지정된 소스 코드를 컴파일한 후 Snowflake가 컴파일된 코드(JAR 파일)를 작성해야 하는 위치를 지정합니다. 이 절을 생략할 경우 Snowflake는 코드가 필요할 때마다 소스 코드를 다시 컴파일합니다.이 절을 지정하는 경우:
이를 기존 파일로 설정할 수 없습니다. TARGET_PATH 가 기존 파일을 가리키는 경우 Snowflake는 오류를 반환합니다.
IMPORTS 및 TARGET_PATH 절을 둘 다 지정하는 경우, 파일이 다른 하위 디렉터리 또는 다른 스테이지에 있더라도 IMPORTS 절의 파일 이름은 TARGET_PATH 절의 각 파일 이름과 달라야 합니다.
더 이상 저장 프로시저를 사용할 필요가 없으면(예: 저장 프로시저를 삭제한 경우) 이 JAR 파일을 수동으로 제거해야 합니다.
액세스 제어 요구 사항¶
이 SQL 명령을 실행하는 데 사용되는 역할 에는 최소한 다음 권한 이 있어야 합니다.
권한 |
오브젝트 |
참고 |
---|---|---|
CREATE PROCEDURE |
스키마 |
|
USAGE |
절차 |
새로 생성된 프로시저에 대한 USAGE 권한을 역할에 부여하면 그 역할을 가진 사용자가 Snowflake의 다른 곳에서 프로시저를 호출할 수 있습니다. |
USAGE |
외부 액세스 통합 |
통합(있는 경우)에 필요하며, EXTERNAL_ACCESS_INTEGRATIONS 매개 변수로 지정됩니다. 자세한 내용은 CREATE EXTERNAL ACCESS INTEGRATION 섹션을 참조하십시오. |
READ |
시크릿 |
SECRETS 매개 변수로 지정된 시크릿(있는 경우)에 필요합니다. 자세한 내용은 자격 증명을 나타내는 시크릿 만들기 및 함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오. |
USAGE |
스키마 |
SECRETS 매개 변수로 지정된 시크릿이 포함된 스키마(있는 경우)에 필요합니다. 자세한 내용은 자격 증명을 나타내는 시크릿 만들기 및 함수 또는 프로시저에서 외부 액세스 통합 사용하기 섹션을 참조하십시오. |
스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.
지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.
보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.
사용법 노트¶
모든 저장 프로시저의 경우:
저장 프로시저는 오버로딩 을 지원합니다. 두 프로시저에 있는 매개 변수의 개수가 다르거나 매개 변수에 대한 데이터 타입이 다른 경우 두 프로시저는 같은 이름을 가질 수 있습니다.
저장 프로시저는 원자성이 아닙니다. 저장 프로시저의 한 문이 실패할 경우 저장 프로시저의 다른 문이 반드시 롤백되는 것은 아닙니다. 저장 프로시저 및 트랜잭션에 대한 자세한 내용은 트랜잭션 관리 를 참조하십시오.
CREATE OR REPLACE <오브젝트> 문은 원자성입니다. 즉, 오브젝트가 바뀔 때 단일 트랜잭션으로 이전 오브젝트가 삭제되고 새 오브젝트가 생성됩니다.
메타데이터 관련:
주의
고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.
팁
조직에서 호출자의 권한 저장 프로시저와 소유자의 권한 저장 프로시저를 혼합하여 사용하는 경우, 저장 프로시저의 명명 규칙을 사용하여 개별 저장 프로시저가 호출자의 권한 저장 프로시저인지, 소유자의 권한 저장 프로시저인지를 나타낼 수 있습니다.
JavaScript 저장 프로시저의 경우:
JavaScript 저장 프로시저는 문자열(예: 성공/실패 표시기) 또는 숫자(예: 오류 코드)와 같은 단일 값만 반환할 수 있습니다. 더 광범위한 정보를 반환해야 하는 경우 구분 기호(예: 쉼표)로 구분된 값을 포함하는 VARCHAR나 VARIANT 와 같은 반정형 데이터 타입을 반환할 수 있습니다.
Java 저장 프로시저의 경우 알려진 제한 사항 을 참조하십시오.
Python 저장 프로시저의 경우 알려진 제한 사항 을 참조하십시오.
Scala 저장 프로시저의 경우 알려진 제한 사항 을 참조하십시오.
예¶
이렇게 하면 하드 코드된 값을 반환하는 보통의 저장 프로시저가 생성됩니다. 이것은 비현실적이지만, 최소한의 JavaScript 코드로 기본 SQL 구문을 보여줍니다.
create or replace procedure sp_pi() returns float not null language javascript as $$ return 3.1415926; $$ ;
이는 JavaScript API에 대한 호출을 포함하는 더 현실적인 예를 보여줍니다. 이 프로시저의 더 광범위한 버전을 사용하면 사용자가 직접 삽입할 권한이 없는 테이블에 데이터를 삽입할 수 있습니다. JavaScript 문은 입력 매개 변수를 확인하고 특정 요구 사항이 충족되는 경우에만 SQL INSERT
를 실행할 수 있습니다.
create or replace procedure stproc1(FLOAT_PARAM1 FLOAT) returns string language javascript strict execute as owner as $$ var sql_command = "INSERT INTO stproc_test_table1 (num_col1) VALUES (" + FLOAT_PARAM1 + ")"; try { snowflake.execute ( {sqlText: sql_command} ); return "Succeeded."; // Return a success/error indicator. } catch (err) { return "Failed: " + err; // Return a success/error indicator. } $$ ;
Java 저장 프로시저의 예는 Java로 저장 프로시저 작성하기 섹션을 참조하십시오.
Python 저장 프로시저의 예는 Python으로 저장 프로시저 작성하기 섹션을 참조하십시오.
Scala 저장 프로시저의 예는 Scala로 저장 프로시저 작성하기 섹션을 참조하십시오.
Snowflake Scripting 저장 프로시저의 예는 Snowflake Scripting에서 저장 프로시저 작성하기 섹션을 참조하십시오.
더 많은 예는 저장 프로시저 작업하기 섹션을 참조하십시오.