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: 블록에서 변수, 커서 등을 사용해야 하는 경우 블록의 DECLARE 섹션이나 블록의 BEGIN ... END 섹션에서 이를 선언할 수 있습니다.

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

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

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

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

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

간단한 블록에는 BEGINEND 키워드만 필요합니다. 예:

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

중요

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

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

코드에서 변수를 사용하는 경우 블록에서 해당 변수를 선언 할 수 있습니다. 이를 수행하는 한 가지 방법은 블록의 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

SnowSQL 또는 Classic Console 을 사용하는 경우 SnowSQL 및 Classic Console 에서 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

익명 블록 사용하기

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

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

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

SnowSQL 또는 Classic Console 을 사용하는 경우 블록을 문자열 리터럴(작은따옴표 또는 이중 달러 기호로 구분)로 지정해야 하며, SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 에 설명된 대로 블록을 EXECUTE IMMEDIATE 명령에 전달해야 합니다.

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;
$$
;
+-----------------+
| anonymous block |
|-----------------|
|    28.274333882 |
+-----------------+
Copy

출력의 열 헤더는 《익명 블록》입니다. 코드가 저장 프로시저에서 실행되었다면 열 헤더는 저장 프로시저의 이름이 되었을 것입니다.

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

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

참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 참조).

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