Snowflake Scripting의 블록 이해하기

Snowflake Scripting에서 사용자는 Snowflake Scripting 블록에 프로시저 코드를 작성합니다. 이 항목에서는 블록에 프로시저 코드를 작성하는 방법에 대해 설명합니다.

블록의 구조 이해하기

블록의 기본 구조는 다음과 같습니다.

DECLARE
  -- (variable declarations, cursor declarations, etc.) ...
BEGIN
  -- (Snowflake Scripting and SQL statements) ...
EXCEPTION
  -- (statements for handling exceptions) ...
END;
Copy

블록은 키워드로 구분된 필수 및 선택 섹션으로 구성됩니다. 각 섹션은 다른 용도로 사용됩니다.

  • DECLARE: 블록에서 변수, 커서, RESULTSETs 또는 예외를 사용해야 하는 경우 블록의 DECLARE 섹션이나 블록의 BEGIN … END 섹션에서 이를 선언할 수 있습니다.

    다음을 선언할 수 있습니다.

    블록의 이 섹션은 선택 사항입니다.

  • BEGIN … END: BEGIN 및 END 사이의 블록 섹션에 SQL 문과 Snowflake Scripting 구문을 작성합니다.

  • EXCEPTION: 예외 처리 코드를 추가해야 하는 경우 블록의 EXCEPTION 섹션에 추가합니다.

    블록의 이 섹션은 선택 사항입니다.

단순 블록에는 BEGIN 및 END 키워드만 필요합니다. 예:

BEGIN
  CREATE TABLE employee (id INTEGER, ...);
  CREATE TABLE dependents (id INTEGER, ...);
END;
Copy

중요

블록을 시작하는 키워드 BEGIN 은 트랜잭션을 시작하는 키워드 BEGIN 과 다릅니다. 혼란을 최소화하기 위해 Snowflake는 단순히 BEGIN 이 아니라 BEGIN TRANSACTION(또는 이전 형식 WORK BEGIN)으로 트랜잭션을 시작할 것을 강력히 권장합니다.

블록에서 생성한 모든 데이터베이스 오브젝트(예: 위의 예에서 테이블)는 블록 외부에서 사용할 수 있습니다.

코드에서 변수를 사용하는 경우 블록에서 해당 변수를 선언 할 수 있습니다. 이를 수행하는 한 가지 방법은 블록의 DECLARE 섹션에 있습니다. 예:

DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := pi() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
Copy

이 예에서는 변수를 선언하고 변수를 사용하며 변수 값을 반환합니다. 블록에서 값을 반환하는 방법에 대한 자세한 내용은 값 반환하기 섹션을 참조하십시오.

이러한 변수는 블록 외부에서 사용할 수 없습니다. 선언 범위 이해하기 섹션을 참조하십시오.

LET 를 사용하여 블록의 BEGIN … END 섹션에서 변수를 선언할 수도 있습니다. 자세한 내용은 변수 선언하기 섹션을 참조하십시오.

저장 프로시저에서 블록 사용하기

저장 프로시저의 정의에서 블록을 사용할 수 있습니다. 다음은 Snowflake Scripting 블록이 포함된 저장 프로시저를 생성하기 위해 Snowsight 에서 실행할 수 있는 예입니다.

CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
DECLARE
  radius FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius := 3;
  area_of_circle := PI() * radius * radius;
  RETURN area_of_circle;
END;
Copy

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

CREATE OR REPLACE PROCEDURE area()
RETURNS FLOAT
LANGUAGE SQL
AS
$$
DECLARE
  radius FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius := 3;
  area_of_circle := PI() * radius * radius;
  RETURN area_of_circle;
END;
$$
;
Copy

CALL 명령을 사용하여 저장 프로시저를 호출할 수 있습니다. 다음 예제는 이전 예제의 저장 프로시저 area 를 호출합니다.

CALL area();
Copy

저장 프로시저는 다음 출력을 반환합니다.

+--------------+
|         AREA |
|--------------|
| 28.274333882 |
+--------------+

익명 블록 사용하기

데이터베이스의 저장 프로시저에 블록을 저장하지 않으려면 익명 블록 을 정의하고 사용할 수 있습니다. 익명 블록은 저장 프로시저의 일부가 아닌 블록입니다. 블록을 별도의 독립 실행형 SQL 문으로 정의합니다.

블록을 정의하는 BEGIN 문도 블록을 실행합니다. (사용자는 블록을 실행하기 위해 별도의 CALL 명령을 실행하지 않습니다.)

다음은 Snowsight 에서 실행할 수 있는 익명 블록의 예입니다.

DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := PI() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
Copy

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

EXECUTE IMMEDIATE $$
DECLARE
  radius_of_circle FLOAT;
  area_of_circle FLOAT;
BEGIN
  radius_of_circle := 3;
  area_of_circle := PI() * radius_of_circle * radius_of_circle;
  RETURN area_of_circle;
END;
$$
;
Copy

이 예에서는 다음 출력을 생성합니다.

+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+

출력의 열 머리글은 anonymous block 입니다. 코드가 저장 프로시저에서 실행되었다면 열 머리글은 저장 프로시저의 이름이 되었을 것입니다.

다음 예에서는 관련된 두 테이블을 생성하는 익명 블록을 정의합니다. 이 예에서 프로시저 코드 블록은 변수를 사용할 필요가 없으므로 블록의 DECLARE 섹션이 생략됩니다.

BEGIN
  CREATE TABLE parent (ID INTEGER);
  CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
  RETURN 'Completed';
END;
Copy

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

EXECUTE IMMEDIATE $$
BEGIN
    CREATE TABLE parent (ID INTEGER);
    CREATE TABLE child (ID INTEGER, parent_ID INTEGER);
    RETURN 'Completed';
END;
$$
;
Copy
+-----------------+
| anonymous block |
|-----------------|
| Completed       |
+-----------------+