루프 작업하기¶
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;참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 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; $$ ;
FOR 문에 대한 전체 구문 및 세부 사항은 FOR(Snowflake Scripting) 섹션을 참조하십시오.
커서 기반 FOR 루프¶
커서 기반 FOR
루프는 결과 세트를 반복합니다. 반복 횟수는 커서 의 행 수에 따라 결정됩니다.
커서 기반 FOR 루프의 구문은 다음과 같습니다.
FOR <row_variable> IN <cursor_name> DO <statement>; [ <statement>; ... ] END FOR [ <label> ] ;
다음 예에서는 invoices
테이블에 대한 커서의 행을 반복하는 FOR 루프를 사용합니다.
CREATE OR REPLACE TABLE invoices (price NUMBER(12, 2)); INSERT INTO invoices (price) VALUES (11.11), (22.22); 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;참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 참조).
CREATE OR REPLACE TABLE invoices (price NUMBER(12, 2)); INSERT INTO invoices (price) VALUES (11.11), (22.22); 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; $$ ;
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;참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$ BEGIN LET counter := 0; WHILE (counter < 5) DO counter := counter + 1; END WHILE; RETURN counter; END; $$ ;
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;참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 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; $$ ;
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;참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 Snowflake Scripting 사용하기 참조).
EXECUTE IMMEDIATE $$ BEGIN LET counter := 5; LOOP IF (counter = 0) THEN BREAK; END IF; counter := counter - 1; END LOOP; RETURN counter; END; $$ ;
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;참고: SnowSQL 또는 Classic Console 을 사용하는 경우 대신 다음 예를 사용하십시오(SnowSQL 및 Classic Console 에서 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까지 증가시킵니다.outer_counter
는 절대 증가하지 않습니다. 이 카운터를 증가시키는 문에는 절대 도달하지 않습니다.BREAK OUTER
가 외부 루프의 끝으로 제어를 전송하기 때문입니다.