DECLARE(Snowflake Scripting)

하나 이상의 Snowflake Scripting 변수, 커서, RESULTSETs, 중첩 저장 프로시저 또는 예외를 선언합니다.

자세한 내용은 다음 항목을 참조하십시오.

참고 항목:

LET

구문

DECLARE
  {   <variable_declaration>
    | <cursor_declaration>
    | <resultset_declaration>
    | <nested_stored_procedure_declaration>
    | <exception_declaration> };
  [
    {   <variable_declaration>
      | <cursor_declaration>
      | <resultset_declaration>
      | <nested_stored_procedure_declaration>
      | <exception_declaration> };
    ...
  ]
Copy

다음 섹션에서는 각 선언 유형에 대한 구문을 더 자세히 설명합니다.

변수 선언 구문

다음 구문을 사용하여 변수 를 선언합니다.

<variable_declaration> ::=
  <variable_name> [<type>] [ { DEFAULT | := } <expression>]
Copy

여기서:

variable_name

변수의 이름입니다. 이름은 오브젝트 식별자 에 대한 명명 규칙을 따라야 합니다.

type

SQL 데이터 타입.

DEFAULT expression 또는 . := expression

변수에 expression 의 값을 할당합니다. typeexpression 이 둘 다 지정된 경우 식은 지정된 type 과 일치하거나 암시적으로 캐스팅 될 수 있는 데이터 타입으로 평가되어야 합니다.

예:

profit NUMBER(38, 2) := 0;
Copy

전체 예는 섹션을 참조하십시오.

변수에 대한 자세한 내용은 변수 작업하기 섹션을 참조하십시오.

커서 선언 구문

다음 구문을 사용하여 커서 를 선언합니다.

<cursor_declaration> ::=
  <cursor_name> CURSOR FOR <query>
Copy

여기서:

cursor_name

커서에 부여할 이름입니다. 이것은 이 블록에서 아직 사용되지 않은 유효한 Snowflake 식별자 일 수 있습니다. 식별자는 FETCH 와 같은 다른 커서 관련 명령에서 사용됩니다.

query

커서가 반복되는 결과 세트를 정의하는 쿼리입니다.

이것은 거의 모든 유효한 SELECT 문일 수 있습니다. SELECT 문에서 바인드 매개 변수를 지정하려면 물음표(?)를 사용합니다. 매개 변수를 바인딩하여 커서를 열 때 USING 절의 변수를 바인딩할 수 있습니다.

예:

c1 CURSOR FOR SELECT id, price FROM invoices;
Copy

커서에 대한 자세한 내용(전체 예 포함)은 커서 작업하기 섹션을 참조하십시오.

RESULTSET 선언 구문

다음 구문을 사용하여:doc:RESULTSET</developer-guide/snowflake-scripting/resultsets> 를 선언합니다.

<resultset_name> RESULTSET [ { DEFAULT | := } [ ASYNC ] ( <query> ) ] ;
Copy

여기서:

resultset_name

RESULTSET에 부여할 이름입니다.

이름은 현재 범위 내에서 고유해야 합니다.

이름은 오브젝트 식별자 에 대한 명명 규칙을 따라야 합니다.

ASYNC

쿼리를 비동기 하위 작업 으로 실행합니다.

쿼리는 SELECT 문과 DML 문을 포함한 모든 유효한 SQL 문(예: INSERT 또는 UPDATE)이 될 수 있습니다.

이 키워드를 생략하면 저장 프로시저는 하위 작업을 순차적으로 실행하고, 각 하위 작업은 실행 중인 하위 작업이 완료될 때까지 기다렸다가 시작합니다.

이 키워드를 사용하여 여러 하위 작업을 동시에 실행하면 효율성을 높이고 전체 실행 시간을 줄일 수 있습니다.

AWAITCANCEL 문을 사용하여 RESULTSET 에 대한 비동기 하위 작업을 관리할 수 있습니다.

DEFAULT query 또는 . := query

query 값을 RESULTSET에 할당합니다.

예:

res RESULTSET DEFAULT (SELECT col1 FROM mytable ORDER BY col1);
Copy

RESULTSET에 대한 자세한 내용(전체 예 포함)은 RESULTSET 작업하기 섹션을 참조하십시오.

중첩 저장 프로시저 선언 구문

다음 구문을 사용하여 중첩 저장 프로시저 를 선언합니다.

<nested_procedure_name> PROCEDURE (
    [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS { <result_data_type> | TABLE ( [ <col_name> <col_data_type> [ , ... ] ] ) }
  AS <nested_procedure_definition>
Copy

여기서:

nested_procedure_name

중첩된 저장 프로시저의 이름입니다. 이름은 오브젝트 식별자 의 명명 규칙을 따라야 합니다.

( [ arg_name arg_data_type ] [ , ... ] )

중첩 저장 프로시저에 대한 입력 인자를 지정합니다.

  • arg_name 의 경우, 입력 인자의 이름을 지정합니다.

  • arg_data_type 의 경우 SQL 데이터 타입 을 지정합니다.

RETURNS { result_data_type | TABLE ( [ col_name col_data_type [ , ... ] ] ) }

저장 프로시저에서 반환된 결과 타입을 지정합니다. 현재, NOT NULL은 중첩 저장 프로시저의 RETURNS 매개 변수에서 지원되지 않습니다.

  • RETURNS result_data_type 의 경우 SQL 데이터 타입 을 지정합니다.

  • RETURNS TABLE ( [ col_name col_data_type [ , ... ] ] ) 의 경우 반환된 테이블에 있는 열의 Snowflake 데이터 타입 을 알면 열 이름과 유형을 지정하십시오.

    RETURNS TABLE (sales_date DATE, quantity NUMBER)
    
    Copy

    그렇지 않으면(예: 런타임 중에 열 유형을 결정하는 경우) 열 이름과 유형을 생략할 수 있습니다.

    RETURNS TABLE ()
    
    Copy

    참고

    현재, RETURNS TABLE(...) 절에서는 GEOGRAPHY 를 열 유형으로 지정할 수 없습니다. 이는 저장 프로시저를 생성하든 익명 프로시저를 생성하든 관계없이 적용됩니다.

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE(g GEOGRAPHY)
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE(g GEOGRAPHY)
      ...
    CALL test_return_geography_table_1();
    
    Copy

    GEOGRAPHY를 열 유형으로 지정하려고 할 경우 저장 프로시저를 호출하면 오류가 발생합니다.

    Stored procedure execution error: data type of returned table does not match expected returned table type
    
    Copy

    이 문제를 해결하려면 RETURNS TABLE() 에서 열 인자와 유형을 생략하면 됩니다.

    CREATE OR REPLACE PROCEDURE test_return_geography_table_1()
      RETURNS TABLE()
      ...
    
    Copy
    WITH test_return_geography_table_1() AS PROCEDURE
      RETURNS TABLE()
      ...
    CALL test_return_geography_table_1();
    
    Copy
AS nested_procedure_definition

중첩 저장 프로시저에 의해 실행되는 코드를 정의합니다. 정의는 어떤 유효한 코드로든 구성될 수 있습니다.

예외 선언 구문

다음 구문을 사용하여 예외 를 선언합니다.

<exception_name> EXCEPTION [ ( <exception_number> , '<exception_message>' ) ] ;
Copy

여기서:

exception_name

예외에 부여할 이름입니다.

exception_number

예외를 고유하게 식별하는 번호입니다. 숫자는 -20000에서 -20999 사이의 정수여야 합니다. 이 번호는 동시에 존재하는 다른 예외에 사용되어서는 안 됩니다.

기본값: -20000

exception_message

예외를 설명하는 메시지입니다. 메시지에는 큰따옴표 문자가 포함되어서는 안 됩니다.

기본값: 빈 문자열입니다.

예:

exception_could_not_create_table EXCEPTION (-20003, 'ERROR: Could not create table.');
Copy

예외에 대한 자세한 내용(전체 예 포함)은 예외 처리하기 섹션을 참조하십시오.

이 예제에서는 Snowflake Scripting 익명 블록에서 사용하기 위해 profit 변수를 선언합니다.

DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
Copy

참고: Python Connector 코드에서 Snowflake CLI, SnowSQL, Classic Console, 또는 execute_stream 또는 execute_string 메서드를 사용하는 경우 이 예제를 대신 사용하십시오(Snowflake CLI, SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).

EXECUTE IMMEDIATE 
$$
DECLARE
  profit number(38, 2) DEFAULT 0.0;
BEGIN
  LET cost number(38, 2) := 100.0;
  LET revenue number(38, 2) DEFAULT 110.0;

  profit := revenue - cost;
  RETURN profit;
END;
$$
;
Copy

변수, 커서, RESULTSETs, 예외를 선언하는 추가 예제는 다음 항목을 참조하세요.