Snowflake Scripting의 블록 이해하기

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

이 항목의 내용:

블록 구조 이해하기

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

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

블록은 키워드로 구분되는 섹션(일부는 선택 사항)으로 구성됩니다. 각 섹션은 다른 용도로 사용됩니다.

  • 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;

중요

블록을 시작하는 키워드 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;

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

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

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;

SnowSQL 또는 클래식 웹 인터페이스 를 사용하는 경우 SnowSQL 및 클래식 웹 인터페이스에서 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;
$$
;

익명 블록 사용하기

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

블록을 정의하는 BEGIN … END 문도 블록을 실행합니다. (사용자는 블록을 실행하기 위해 별도의 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;

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

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

SnowSQL 또는 클래식 웹 인터페이스 를 사용하는 경우 블록을 문자열 리터럴(작은따옴표 또는 이중 달러 기호로 구분)로 지정해야 하며, SnowSQL 및 클래식 웹 인터페이스에서 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 |
+-----------------+

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

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

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

참고: SnowSQL 또는 클래식 웹 인터페이스 를 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 클래식 웹 인터페이스에서 Snowflake Scripting 사용하기 참조).

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