FOR(Snowflake Scripting)

FOR 루프는 특정 횟수만큼 일련의 단계를 반복합니다. 횟수는 사용자가 지정하거나 커서 의 행 수로 지정할 수 있습니다. 이 두 가지 타입의 FOR 루프 구문은 약간 다릅니다.

루프에 대한 자세한 내용은 루프 작업하기 섹션을 참조하십시오.

참고

Snowflake Scripting 구문은 Snowflake Scripting 블록 내에서만 유효합니다.

참고 항목

BREAK, CONTINUE

구문

커서 의 모든 행을 반복하려면 다음을 사용합니다.

FOR <row_variable> IN <cursor_name> DO
    statement;
    [ statement; ... ]
END FOR [ <label> ] ;
Copy

지정된 횟수만큼 반복하려면 다음을 사용합니다.

FOR <counter_variable> IN [ REVERSE ] <start> TO <end> { DO | LOOP }
    statement;
    [ statement; ... ]
END { FOR | LOOP } [ <label> ] ;
Copy

여기서:

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 값보다 크거나 같아야 합니다. endstart 보다 작으면 루프는 0번 실행됩니다(REVERSE 키워드가 사용되더라도 마찬가지).

statement

문은 다음 중 하나일 수 있습니다.

  • 단일 SQL 문(CALL 포함).

  • 제어 흐름 문(예: 루핑 또는 분기 문).

  • 중첩 블록.

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);
Copy
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;
$$
;
Copy

다음은 저장 프로시저의 출력입니다.

CALL for_loop_over_cursor();
+----------------------+
| FOR_LOOP_OVER_CURSOR |
|----------------------|
|                33.33 |
+----------------------+
Copy
카운터 기반 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;
$$;
Copy

다음은 저장 프로시저의 출력입니다.

CALL simple_for(3);
+------------+
| SIMPLE_FOR |
|------------|
|          3 |
+------------+
Copy

다음 예에서는 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;
$$;
Copy

다음은 저장 프로시저의 출력입니다.

CALL reverse_loop(3);
+--------------+
| REVERSE_LOOP |
|--------------|
|  3 2 1       |
+--------------+
Copy

다음 예는 루프 카운터 변수 및 이미 선언된 변수가 동일한 이름(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;
$$;
Copy

다음은 저장 프로시저의 출력입니다.

CALL p(3);
+------------+
| P          |
|------------|
| counter: 3 |
| i: -999    |
+------------+
Copy