루프 작업하기

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> ] ;
Copy

예를 들어 다음 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;
Copy

참고: 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;
$$
;
Copy

FOR 문에 대한 전체 구문 및 세부 사항은 FOR(Snowflake Scripting) 섹션을 참조하십시오.

커서 기반 FOR 루프

커서 기반 FOR 루프는 결과 세트를 반복합니다. 반복 횟수는 커서 의 행 수에 따라 결정됩니다.

커서 기반 FOR 루프의 구문은 다음과 같습니다.

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

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

참고: 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;
$$
;
Copy

FOR 문에 대한 전체 구문 및 세부 사항은 FOR(Snowflake Scripting) 섹션을 참조하십시오.

WHILE 루프

WHILE 루프는 조건이 true인 동안 반복됩니다. WHILE 루프에서 조건은 루프 본문을 실행하기 직전에 테스트됩니다. 첫 번째 반복 전에 조건이 false이면 루프 본문은 한 번도 실행되지 않습니다.

WHILE 루프의 구문은 다음과 같습니다.

WHILE ( <condition> ) { DO | LOOP }
  <statement>;
  [ <statement>; ... ]
END { WHILE | LOOP } [ <label> ] ;
Copy

예:

BEGIN
  LET counter := 0;
  WHILE (counter < 5) DO
    counter := counter + 1;
  END WHILE;
  RETURN counter;
END;
Copy

참고: 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;
$$
;
Copy

WHILE 문에 대한 전체 구문 및 세부 사항은 WHILE(Snowflake Scripting) 섹션을 참조하십시오.

REPEAT 루프

REPEAT 루프는 조건이 true일 때까지 반복됩니다. REPEAT 루프에서 조건은 루프 본문을 실행한 직후에 테스트됩니다. 결과적으로, 루프의 본문은 항상 적어도 한 번 실행됩니다.

REPEAT 루프의 구문은 다음과 같습니다.

REPEAT
  <statement>;
  [ <statement>; ... ]
UNTIL ( <condition> )
END REPEAT [ <label> ] ;
Copy

예:

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

참고: 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;
$$
;
Copy

REPEAT 문에 대한 전체 구문 및 세부 사항은 REPEAT(Snowflake Scripting) 섹션을 참조하십시오.

LOOP 루프

LOOP 루프는 BREAK 명령이 실행될 때까지 실행됩니다. 이러한 BREAK 명령은 일반적으로 분기 논리(예: IF 문 문 또는 CASE 문 문) 내부에 포함됩니다.

LOOP 문의 구문은 다음과 같습니다.

LOOP
  <statement>;
  [ <statement>; ... ]
END LOOP [ <label> ] ;
Copy

예:

BEGIN
  LET counter := 5;
  LOOP
    IF (counter = 0) THEN
      BREAK;
    END IF;
    counter := counter - 1;
  END LOOP;
  RETURN counter;
END;
Copy

참고: 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;
$$
;
Copy

LOOP 문에 대한 전체 구문 및 세부 사항은 LOOP(Snowflake Scripting) 섹션을 참조하십시오.

루프 또는 반복 종료하기

루프 구성에서 루프 또는 루프의 반복이 일찍 종료되어야 하는 시기를 지정할 수 있습니다. 다음 섹션에서는 이에 대해 자세히 설명합니다.

루프 종료하기

BREAK 명령을 실행하여 루프를 명시적으로 조기에 종료할 수 있습니다. BREAK (및 그 동의어 EXIT)는 현재 반복을 즉시 중지하고 나머지 반복을 건너뜁니다. BREAK 는 루프가 끝난 후 첫 번째 실행 가능 문으로 이동하는 것으로 생각할 수 있습니다.

BREAKLOOP 에서 필요하지만 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;
Copy

참고: 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;
$$;
Copy

이 예에서:

  • OUTER 라는 레이블의 루프에 중첩된 INNER 라는 레이블의 루프가 있습니다.

  • CONTINUE OUTEROUTER 라는 레이블이 지정된 루프의 또 다른 반복을 시작합니다.

  • BREAK OUTER 는 내부 루프를 종료하고 외부 루프(OUTER 로 레이블이 지정됨)의 끝으로 제어를 전송합니다.

이 명령의 출력은 다음과 같습니다.

+-----------------+
| anonymous block |
|-----------------|
| [               |
|   0,            |
|   5             |
| ]               |
+-----------------+
Copy

출력에 표시된 대로:

  • inner_counter 는 5까지 증가합니다. CONTINUE OUTER 는 외부 루프의 새 반복을 시작하고, 이는 내부 루프의 새 반복을 시작하여 이 카운터를 최대 5까지 증가시킵니다.

  • outer_counter 는 절대 증가하지 않습니다. 이 카운터를 증가시키는 문에는 절대 도달하지 않습니다. BREAK OUTER 가 외부 루프의 끝으로 제어를 전송하기 때문입니다.