CREATE PROCEDURE

CREATE PROCEDURE

새 저장 프로시저(stored procedure)를 만드는 명령이에요. 프로시저는 다음 언어 중 하나로 작성할 수 있어요: Java(Snowpark 사용), JavaScript, Python(Snowpark 사용), Scala(Snowpark 사용), Snowflake Scripting.

출처: 문서

본문

익명(저장되지 않은) 프로시저를 만들고 호출하려면 CALL(익명 프로시저)을 사용해요. 익명 프로시저 생성에는 CREATE PROCEDURE 스키마 권한이 필요하지 않아요.

이 명령은 다음 변형(variant)을 지원해요:

  • CREATE OR ALTER PROCEDURE: 프로시저가 없으면 만들고, 있으면 수정합니다.

구문 (Syntax)

Java 핸들러 (인라인):

CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ 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_directory_or_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 { OWNER | CALLER | RESTRICTED CALLER } ]
  AS '<procedure_definition>'

Java 핸들러 (사전 컴파일):

CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ 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_directory_or_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 { OWNER | CALLER | RESTRICTED CALLER } ]

JavaScript 핸들러:

CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ 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 { OWNER | CALLER | RESTRICTED CALLER } ]
  AS '<procedure_definition>'

JavaScript는 대/소문자를 구분하고 SQL은 그렇지 않아요. JavaScript 코드에서 프로시저 인자 이름을 사용할 때 주의하세요.

Python 핸들러 (인라인):

CREATE [ OR REPLACE ] [ { TEMP | TEMPORARY } ] [ 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>'
  [ ARTIFACT_REPOSITORY = `<repository_name>` ]
  [ PACKAGES = ( '<package_name>' [ , ... ] ) ]
  [ IMPORTS = ( '<stage_path_and_directory_or_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 { OWNER | CALLER | RESTRICTED CALLER }]
  AS '<procedure_definition>'

Python 핸들러 (스테이지 파일): HANDLER = '<module_file_name>.<function_name>' 형식을 사용해요.

Scala 핸들러 (인라인): LANGUAGE SCALA, RUNTIME_VERSION, PACKAGES = ( 'com.snowflake:snowpark_<scala_version>:<version>' [, ... ] ) 등을 사용하며 Java와 유사한 형태예요.

Snowflake Scripting 핸들러:

CREATE [ OR REPLACE ] PROCEDURE <name> (
    [ <arg_name> [ { IN | INPUT | OUT | OUTPUT } ] <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 { OWNER | CALLER | RESTRICTED CALLER } ]
  AS <procedure_definition>

프로시저 범위 임시 테이블 (Snowflake Scripting):

CREATE [ OR REPLACE ] PROCEDURE SCOPED { TEMP | TEMPORARY } TABLE <table_name> ( <col_name> <col_data_type> [ , ... ] ) ;

이 문은 CREATE PROCEDURE로 시작하지만 중첩 저장 프로시저를 정의하지 않아요. 현재 프로시저 실행 동안에만 존재하는 프로시저 범위 임시 테이블을 선언해요. 테이블은 같은 프로시저 실행 내에서만 보이고 실행이 끝나면 자동으로 드롭돼요.

CREATE OR ALTER PROCEDURE 구문

CREATE [ OR ALTER ] PROCEDURE ...

지원되는 수정:

  • LOG_LEVEL, TRACE_LEVEL, COMMENT, SECURE, 반환 타입, 프로시저 본문.
  • Python/Scala/Java 저장 프로시저의 SECRETS, EXTERNAL_ACCESS_INTEGRATIONS, RUNTIME_VERSION, IMPORTS, PACKAGES; Python은 ARTIFACT_REPOSITORY도.
  • 실행 권한(EXECUTE AS CALLER 또는 EXECUTE AS OWNER).

필수 매개변수

모든 언어

  • name ( [ arg_name [ { IN | INPUT | OUT | OUTPUT } ] arg_data_type [ DEFAULT default_value ] ] [ , … ] ): 저장 프로시저의 식별자(name), 인자, 선택적 인자의 기본값을 지정해요.
    • 프로시저는 이름과 인자 타입의 조합으로 식별/해석되므로 식별자가 스키마 내에서 고유할 필요는 없어요.
    • { IN | INPUT | OUT | OUTPUT }은 인자 유형(입력/출력)을 지정하며 Snowflake Scripting 저장 프로시저에만 유효해요.
    • arg_data_type은 사용하는 언어에 해당하는 Snowflake 데이터 타입이에요.

더 알아보기 (Learn more)