루프 작업하기¶
Snowflake Scripting은 다음 타입의 루프를 지원합니다.
이 항목에서는 이러한 형식의 루프를 각각 사용하는 방법에 대해 설명합니다.
FOR 루프¶
FOR 루프는 지정된 횟수만큼 또는 결과 세트의 각 행에 대해 일련의 스테이지를 반복합니다. Snowflake Scripting은 다음 타입의 FOR 루프를 지원합니다.
다음 섹션에서는 이러한 타입의 FOR 루프를 사용하는 방법을 설명합니다.
카운터 기반 FOR 루프¶
카운터 기반 FOR 루프는 지정된 횟수만큼 실행합니다.
카운터 기반 FOR 루프의 구문은 다음과 같습니다.
FOR <counter_variable> IN [ REVERSE ] <start> TO <end> { DO | LOOP }
<statement>;
[ <statement>; ... ]
END { FOR | LOOP } [ <label> ] ;
예를 들어 다음 FOR 루프는 5번 실행됩니다.
DECLARE
counter INTEGER DEFAULT 0;
maximum_count INTEGER default 5;
BEGIN
FOR i IN 1 TO maximum_count DO
counter := counter + 1;
END FOR;
RETURN counter;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
DECLARE
counter INTEGER DEFAULT 0;
maximum_count INTEGER default 5;
BEGIN
FOR i IN 1 TO maximum_count DO
counter := counter + 1;
END FOR;
RETURN counter;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 5 |
+-----------------+
FOR 루프에 대한 전체 구문 및 세부 사항은 FOR(Snowflake Scripting) 섹션을 참조하십시오.
커서 기반 FOR 루프¶
커서 기반 FOR 루프는 결과 세트를 반복합니다. 반복 횟수는 커서 의 행 수에 따라 결정됩니다.
커서 기반 FOR 루프의 구문은 다음과 같습니다.
FOR <row_variable> IN <cursor_name> DO
<statement>;
[ <statement>; ... ]
END FOR [ <label> ] ;
이 섹션의 예제에서는 다음 invoices
테이블의 데이터를 사용합니다.
CREATE OR REPLACE TABLE invoices (price NUMBER(12, 2));
INSERT INTO invoices (price) VALUES
(11.11),
(22.22);
다음 예에서는 invoices
테이블에 대한 커서의 행을 반복하는 FOR 루프를 사용합니다.
DECLARE
total_price FLOAT;
c1 CURSOR FOR SELECT price FROM invoices;
BEGIN
total_price := 0.0;
FOR record IN c1 DO
total_price := total_price + record.price;
END FOR;
RETURN total_price;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
DECLARE
total_price FLOAT;
c1 CURSOR FOR SELECT price FROM invoices;
BEGIN
total_price := 0.0;
FOR record IN c1 DO
total_price := total_price + record.price;
END FOR;
RETURN total_price;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 33.33 |
+-----------------+
FOR 루프에 대한 전체 구문 및 세부 사항은 FOR(Snowflake Scripting) 섹션을 참조하십시오.
RESULTSET 기반 FOR 루프¶
RESULTSET 기반 FOR 루프는 결과 세트를 반복합니다. 반복 횟수는 RESULTSET 쿼리에서 반환되는 행 수에 따라 결정됩니다.
RESULTSET 기반 FOR 루프의 구문은 다음과 같습니다.
FOR <row_variable> IN <RESULTSET_name> DO
<statement>;
[ <statement>; ... ]
END FOR [ <label> ] ;
이 섹션의 예제에서는 다음 invoices
테이블의 데이터를 사용합니다.
CREATE OR REPLACE TABLE invoices (price NUMBER(12, 2));
INSERT INTO invoices (price) VALUES
(11.11),
(22.22);
다음 블록은 FOR 루프를 사용하여 invoices
테이블의 RESULTSET에 있는 행을 반복합니다.
DECLARE
total_price FLOAT;
rs RESULTSET;
BEGIN
total_price := 0.0;
rs := (SELECT price FROM invoices);
FOR record IN rs DO
total_price := total_price + record.price;
END FOR;
RETURN total_price;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
DECLARE
total_price FLOAT;
rs RESULTSET;
BEGIN
total_price := 0.0;
rs := (SELECT price FROM invoices);
FOR record IN rs DO
total_price := total_price + record.price;
END FOR;
RETURN total_price;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 33.33 |
+-----------------+
FOR 루프에 대한 전체 구문 및 세부 사항은 FOR(Snowflake Scripting) 섹션을 참조하십시오.
WHILE 루프¶
WHILE 루프는 조건이 true인 동안 반복됩니다. WHILE 루프에서 조건은 루프 본문을 실행하기 직전에 테스트됩니다. 첫 번째 반복 전에 조건이 false이면 루프 본문은 한 번도 실행되지 않습니다.
WHILE 루프의 구문은 다음과 같습니다.
WHILE ( <condition> ) { DO | LOOP }
<statement>;
[ <statement>; ... ]
END { WHILE | LOOP } [ <label> ] ;
예:
BEGIN
LET counter := 0;
WHILE (counter < 5) DO
counter := counter + 1;
END WHILE;
RETURN counter;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
BEGIN
LET counter := 0;
WHILE (counter < 5) DO
counter := counter + 1;
END WHILE;
RETURN counter;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 5 |
+-----------------+
WHILE 루프에 대한 전체 구문 및 세부 사항은 WHILE(Snowflake Scripting) 섹션을 참조하십시오.
REPEAT 루프¶
REPEAT 루프는 조건이 true일 때까지 반복됩니다. REPEAT 루프에서 조건은 루프 본문을 실행한 직후에 테스트됩니다. 결과적으로, 루프의 본문은 항상 적어도 한 번 실행됩니다.
REPEAT 루프의 구문은 다음과 같습니다.
REPEAT
<statement>;
[ <statement>; ... ]
UNTIL ( <condition> )
END REPEAT [ <label> ] ;
예:
BEGIN
LET counter := 5;
LET number_of_iterations := 0;
REPEAT
counter := counter - 1;
number_of_iterations := number_of_iterations + 1;
UNTIL (counter = 0)
END REPEAT;
RETURN number_of_iterations;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
BEGIN
LET counter := 5;
LET number_of_iterations := 0;
REPEAT
counter := counter - 1;
number_of_iterations := number_of_iterations + 1;
UNTIL (counter = 0)
END REPEAT;
RETURN number_of_iterations;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 5 |
+-----------------+
REPEAT 루프에 대한 전체 구문 및 세부 사항은 REPEAT(Snowflake Scripting) 섹션을 참조하십시오.
LOOP 루프¶
LOOP 루프는 BREAK 명령이 실행될 때까지 실행됩니다. BREAK 명령은 일반적으로 분기 논리(예: IF 문 문 또는 CASE 문 문) 내부에 포함됩니다.
LOOP 문의 구문은 다음과 같습니다.
LOOP
<statement>;
[ <statement>; ... ]
END LOOP [ <label> ] ;
예:
BEGIN
LET counter := 5;
LOOP
IF (counter = 0) THEN
BREAK;
END IF;
counter := counter - 1;
END LOOP;
RETURN counter;
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
BEGIN
LET counter := 5;
LOOP
IF (counter = 0) THEN
BREAK;
END IF;
counter := counter - 1;
END LOOP;
RETURN counter;
END;
$$
;
+-----------------+
| anonymous block |
|-----------------|
| 0 |
+-----------------+
LOOP 루프에 대한 전체 구문 및 세부 사항은 LOOP(Snowflake Scripting) 섹션을 참조하십시오.
루프 또는 반복 종료하기¶
루프 구조체에서 루프 또는 루프의 반복이 일찍 종료되어야 하는 시기를 지정할 수 있습니다. 다음 섹션에서는 이에 대해 자세히 설명합니다.
루프 종료하기¶
BREAK 명령을 실행하여 루프를 명시적으로 조기에 종료할 수 있습니다. BREAK(및 동의어 EXIT)는 현재 반복을 즉시 중지하고 나머지 반복을 건너뜁니다. BREAK 는 루프가 끝난 후 첫 번째 실행 가능 문으로 이동하는 것으로 생각할 수 있습니다.
BREAK는 LOOP 루프에 필요하지만, WHILE, FOR 및 REPEAT 루프에는 필요하지 않습니다. 대부분의 경우, 건너뛰고 싶은 문이 있는 경우 표준 분기 구문(IF 문 및 CASE 문)을 사용하여, 루프 내에서 실행할 문을 제어할 수 있습니다.
BREAK 명령 자체는 일반적으로 IF 또는 CASE 문 내부에 있습니다.
루프를 종료하지 않고 반복 종료하기¶
CONTINUE (또는 ITERATE) 명령을 사용하여 루프의 나머지 문을 건너뛰고 루프 반복의 끝으로 이동할 수 있습니다 루프는 다음 반복이 시작될 때 계속됩니다.
이러한 이동은 거의 필요하지 않습니다. 대부분의 경우, 건너뛰고 싶은 문이 있는 경우 표준 분기 구문(IF 문 및 CASE 문)을 사용하여, 루프 내에서 실행할 문을 제어할 수 있습니다.
CONTINUE 또는 ITERATE 명령 자체는 일반적으로 IF 또는 CASE 문 내부에 있습니다.
종료 후 실행을 계속해야 하는 위치 지정하기¶
BREAK 또는 CONTINUE 명령에서 코드의 특정 지점(예: 중첩 루프의 외부 루프)에서 실행을 계속해야 하는 경우, 실행을 계속해야 하는 지점을 식별하는 레이블을 지정합니다.
다음 예에서는 중첩 루프에서 이를 보여줍니다.
BEGIN
LET inner_counter := 0;
LET outer_counter := 0;
LOOP
LOOP
IF (inner_counter < 5) THEN
inner_counter := inner_counter + 1;
CONTINUE OUTER;
ELSE
BREAK OUTER;
END IF;
END LOOP INNER;
outer_counter := outer_counter + 1;
BREAK;
END LOOP OUTER;
RETURN ARRAY_CONSTRUCT(outer_counter, inner_counter);
END;
참고: Python Connector 코드에서 SnowSQL, Classic Console 또는 execute_stream
또는 execute_string
메서드를 사용하는 경우 이 예제를 대신 사용하십시오(SnowSQL, Classic Console 및 Python Connector에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$
BEGIN
LET inner_counter := 0;
LET outer_counter := 0;
LOOP
LOOP
IF (inner_counter < 5) THEN
inner_counter := inner_counter + 1;
CONTINUE OUTER;
ELSE
BREAK OUTER;
END IF;
END LOOP INNER;
outer_counter := outer_counter + 1;
BREAK;
END LOOP OUTER;
RETURN ARRAY_CONSTRUCT(outer_counter, inner_counter);
END;
$$;
이 예제에서:
OUTER 라는 레이블의 루프에 중첩된 INNER 라는 레이블의 루프가 있습니다.
CONTINUE OUTER는 OUTER 레이블이 지정된 루프의 또 다른 반복을 시작합니다.
BREAK OUTER는 내부 루프를 종료하고 외부 루프(OUTER로 레이블이 지정됨)의 끝으로 제어를 전송합니다.
이 명령의 출력은 다음과 같습니다.
+-----------------+
| anonymous block |
|-----------------|
| [ |
| 0, |
| 5 |
| ] |
+-----------------+
출력에 표시된 대로:
inner_counter
는 5까지 증가합니다. CONTINUE OUTER는 외부 루프의 새 반복을 시작하고, 이는 내부 루프의 새 반복을 시작하여 이 카운터를 최대 5까지 증가시킵니다. 이러한 반복은inner_counter
의 값이 5가 되고 BREAK OUTER가 내부 루프를 종료할 때까지 계속됩니다.outer_counter
는 절대 증가하지 않습니다. 이 카운터를 증가시키는 문에는 절대 도달하지 않습니다. BREAK OUTER가 외부 루프의 끝으로 제어를 전송하기 때문입니다.