FOR(Snowflake Scripting)¶
FOR 루프는 특정 횟수만큼 일련의 단계를 반복합니다. 횟수는 사용자가 지정하거나 커서 의 행 수로 지정할 수 있습니다. 이 두 가지 타입의 FOR 루프 구문은 약간 다릅니다.
루프에 대한 자세한 내용은 루프 작업하기 섹션을 참조하십시오.
참고
이 Snowflake Scripting 구문은 Snowflake Scripting 블록 내에서만 유효합니다.
구문¶
커서 의 모든 행을 반복하려면 다음을 사용합니다.
FOR <row_variable> IN <cursor_name> DO statement; [ statement; ... ] END FOR [ <label> ] ;
지정된 횟수만큼 반복하려면 다음을 사용합니다.
FOR <counter_variable> IN [ REVERSE ] <start> TO <end> { DO | LOOP } statement; [ statement; ... ] END { FOR | LOOP } [ <label> ] ;
여기서:
row_variable
오브젝트 식별자 에 대한 규칙을 따르는 변수 이름을 지정합니다.
DECLARE 또는 BEGIN … END 섹션에서 이 변수에 대한 선언을 추가하지 마십시오. 이름은 로컬 블록의 범위에 이미 정의되어 있지 않아야 합니다.
이름은
FOR루프 내부에서 유효하지만,FOR루프 외부에서는 유효하지 않습니다.
row_variable는 커서에서 한 행을 보유합니다. 해당 행 내의 필드는 점 표기법을 사용하여 액세스합니다. 예:
my_row_variable.my_column_name보다 완전한 예가 아래 예에 포함되어 있습니다.
counter_variable
오브젝트 식별자 에 대한 규칙을 따르는 변수 이름을 지정합니다.
counter_variable의 이름은FOR루프 내에서만 유효합니다. 루프 외부에서 동일 이름의 변수를 선언하면 외부 변수와 루프 변수가 분리됩니다. 루프 내에서 해당 이름에 대한 참조는 루프 변수로 확인됩니다.
FOR루프 내부의 코드는 카운터 변수의 값을 읽을 수 있지만, 변경해서는 안 됩니다. 예를 들어, 단계 크기를 변경하기 위해 카운터 변수를 수동으로 증가시키지 마십시오.
start
counter_variable의 초기 값입니다.시작 값은 INTEGER이거나 INTEGER로 평가되는 식이어야 합니다.
end
이것은 반복함에 따라
counter_variable이 증가된 후의counter_variable최종 값입니다.끝 값은 INTEGER이거나 INTEGER로 평가되는 식이어야 합니다.
end값은start값보다 크거나 같아야 합니다.end가start보다 작으면 루프는 0번 실행됩니다(REVERSE키워드가 사용되더라도 마찬가지).
cursor_name
반복할 커서의 이름입니다.
label
선택적 레이블입니다. 이러한 레이블은 BREAK(Snowflake Scripting) 또는 CONTINUE(Snowflake Scripting) 문의 이동 대상일 수 있습니다. 레이블은 오브젝트 식별자 의 명명 규칙을 따라야 합니다.
사용법 노트¶
- 루프는 - end포인트까지(해당 포인트 포함) 반복합니다.- 예를 들어, - FOR i IN 1 TO 10은 10번 반복하며 마지막 반복 동안- i값은 10입니다.- REVERSE키워드를 사용하는 경우 루프는- start값까지(해당 값 포함) 거꾸로 반복합니다.
- 루프는 여러 문을 포함할 수 있습니다. 이러한 문을 포함하는 BEGIN … END(Snowflake Scripting) 블록 을 사용할 수 있지만, 반드시 사용해야 하는 것은 아닙니다. 
- 선택적 키워드 - REVERSE를 사용하면 Snowflake가- end값으로 시작하여- start값까지 감소합니다.
- 루프 내에서 - counter_variable값을 변경할 수 있지만, Snowflake는 이 작업을 피할 것을 권장합니다. 값을 변경하면 코드를 이해하기가 더 어려워집니다.
- 키워드 - DO를 사용하는 경우- FOR루프 끝에- END FOR를 사용하십시오. 키워드- LOOP를 사용하는 경우- FOR루프 끝에- END LOOP를 사용하십시오.
예¶
- 커서 기반 FOR 루프:
이 예에서는 커서 를 사용하여, 쿼리에 의해 반환된 모든 행의 price 열 값을 합산하는 방법을 보여줍니다. 이 저장 프로시저는 집계 함수처럼 작동합니다.
CREATE or replace TABLE invoices (price NUMBER(12, 2)); INSERT INTO invoices (price) VALUES (11.11), (22.22);CREATE OR REPLACE PROCEDURE for_loop_over_cursor() RETURNS FLOAT LANGUAGE SQL AS $$ DECLARE total_price FLOAT; c1 CURSOR FOR SELECT price FROM invoices; BEGIN total_price := 0.0; OPEN c1; FOR rec IN c1 DO total_price := total_price + rec.price; END FOR; CLOSE c1; RETURN total_price; END; $$ ;다음은 저장 프로시저의 출력입니다.
CALL for_loop_over_cursor(); +----------------------+ | FOR_LOOP_OVER_CURSOR | |----------------------| | 33.33 | +----------------------+
- 카운터 기반 FOR 루프:
이 예에서는 FOR 루프를 사용하여 지정 횟수만큼 반복하는 방법을 보여줍니다.
CREATE PROCEDURE simple_for(iteration_limit INTEGER) RETURNS INTEGER LANGUAGE SQL AS $$ DECLARE counter INTEGER DEFAULT 0; BEGIN FOR i IN 1 TO iteration_limit DO counter := counter + 1; END FOR; RETURN counter; END; $$;다음은 저장 프로시저의 출력입니다.
CALL simple_for(3); +------------+ | SIMPLE_FOR | |------------| | 3 | +------------+
다음 예에서는 REVERSE 키워드를 사용하여 거꾸로 계산하는 방법을 보여줍니다.
CREATE PROCEDURE reverse_loop(iteration_limit INTEGER) RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE values_of_i VARCHAR DEFAULT ''; BEGIN FOR i IN REVERSE 1 TO iteration_limit DO values_of_i := values_of_i || ' ' || i::varchar; END FOR; RETURN values_of_i; END; $$;다음은 저장 프로시저의 출력입니다.
CALL reverse_loop(3); +--------------+ | REVERSE_LOOP | |--------------| | 3 2 1 | +--------------+
다음 예는 루프 카운터 변수 및 이미 선언된 변수가 동일한 이름(i)을 가질 때의 동작을 보여줍니다. FOR 루프 내에서, i 에 대한 참조는 (루프 외부에서 선언된 변수가 아니라) 루프 카운터 변수로 확인됩니다.
CREATE PROCEDURE p(iteration_limit INTEGER) RETURNS VARCHAR LANGUAGE SQL AS $$ DECLARE counter INTEGER DEFAULT 0; i INTEGER DEFAULT -999; return_value VARCHAR DEFAULT ''; BEGIN FOR i IN 1 TO iteration_limit DO counter := counter + 1; END FOR; return_value := 'counter: ' || counter::varchar || '\n'; return_value := return_value || 'i: ' || i::VARCHAR; RETURN return_value; END; $$;다음은 저장 프로시저의 출력입니다.
CALL p(3); +------------+ | P | |------------| | counter: 3 | | i: -999 | +------------+