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:
BEGIN
및END
사이의 블록 섹션에 SQL 문과 Snowflake Scripting 구문을 작성합니다.EXCEPTION: 예외 처리 코드를 추가해야 하는 경우 블록의
EXCEPTION
섹션에 추가합니다.블록의 이 섹션은 선택 사항입니다.
간단한 블록에는 BEGIN
및 END
키워드만 필요합니다. 예:
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 | +-----------------+