CodeGym /행동 /SQL SELF /PL/pgSQL에서 LOOP, FOR, WHILE 루프 사용하기

PL/pgSQL에서 LOOP, FOR, WHILE 루프 사용하기

SQL SELF
레벨 51, 레슨 1
사용 가능

루프는 어떤 조건이 충족될 때까지, 또는 데이터 집합을 순회할 때까지 코드 블록을 여러 번 실행할 수 있게 해줘. 이건 반복 작업 자동화, 대량 데이터 처리, 반복 연산에 엄청 유용하지.

예를 들어, 네가 그룹에 있는 모든 아이들에게 사탕을 직접 나눠줘야 한다고 상상해봐. 완전 혼돈이겠지! 대신 아이들 리스트를 하나씩 돌면서 차례로 사탕을 주면 돼. 여기서 "리스트를 도는 것"이 바로 루프야.

PostgreSQL에서는 여러 종류의 루프를 지원해:

  1. LOOP — 명시적으로 멈추기 전까지 계속 도는 범용 루프.
  2. FOR — 숫자 범위나 쿼리 결과를 정해진 횟수만큼 도는 루프.
  3. WHILE — 조건이 참인 동안 계속 도는 루프.

각 루프를 하나씩 살펴보자.

무한 루프: LOOP

LOOP는 PL/pgSQL에서 가장 기본적인 루프 형태야. 코드 블록을 반복 실행하지. 이 루프는 무한히 돌기 때문에 EXIT 명령으로 직접 종료해줘야 해.

문법:

LOOP
    -- 네 코드 여기
END LOOP;

예시를 들어볼게. LOOP로 1부터 10까지 합을 구해보자:

DO $$
DECLARE
    counter INT := 1;
    sum INT := 0;
BEGIN
    LOOP
        sum := sum + counter; -- 현재 카운터 값을 더함
        counter := counter + 1; -- 카운터 증가

        -- 카운터가 10보다 크면 루프 종료
        IF counter > 10 THEN
            EXIT;
        END IF;
    END LOOP;

    RAISE NOTICE '1부터 10까지의 합: %', sum;
END $$;
  1. counter 변수는 매 반복마다 증가해.
  2. IF counter > 10 THEN EXIT; 조건이 카운터가 10을 넘으면 루프를 끝내.
  3. 마지막에 숫자 합계를 출력해.

범위 또는 데이터셋 루프: FOR

두 번째 루프인 FOR는 다음과 같은 경우에 써:

  1. 숫자 범위 순회.
  2. SQL 쿼리 결과 순회.

숫자 범위 루프

문법:

FOR variable IN [REVERSE] start..end LOOP
    -- 네 코드 여기
END LOOP;

1부터 5까지 숫자 출력해보자:

DO $$
BEGIN
    FOR i IN 1..5 LOOP
        RAISE NOTICE '현재 값: %', i;
    END LOOP;
END $$;

역순 예시:

DO $$
BEGIN
    FOR i IN REVERSE 5..1 LOOP
        RAISE NOTICE '역순: %', i;
    END LOOP;
END $$;

SQL 쿼리 결과 루프

이 방식은 테이블의 행을 처리할 때 유용해.

문법:

FOR variable IN QUERY (SELECT ...) LOOP
    -- 네 코드 여기
END LOOP;

students 테이블의 행을 순회하는 예시:

DO $$
DECLARE
    student_name TEXT;
BEGIN
    FOR student_name IN QUERY (SELECT name FROM students) LOOP
        RAISE NOTICE '안녕, %!', student_name;
    END LOOP;
END $$;

조건 루프: WHILE

WHILE는 주어진 조건이 참인 동안 계속 실행돼.

문법:

WHILE 조건 LOOP
    -- 네 코드 여기
END LOOP;

WHILE로 1부터 10까지 합을 구해보자:

DO $$
DECLARE
    counter INT := 1;
    sum INT := 0;
BEGIN
    WHILE counter <= 10 LOOP
        sum := sum + counter;
        counter := counter + 1;
    END LOOP;

    RAISE NOTICE '1부터 10까지의 합: %', sum;
END $$;

실생활 예시

이제 루프의 기본을 알았으니, 실제로 어떻게 쓰는지 예시를 보자.

예시 1: 구구단(곱셈표) 만들기

DO $$
DECLARE
    i INT;
    j INT;
BEGIN
    FOR i IN 1..5 LOOP
        FOR j IN 1..5 LOOP
            RAISE NOTICE '% x % = %', i, j, i * j;
        END LOOP;
    END LOOP;
END $$;

예시 2: 쿼리 결과 순회하기. 예를 들어 products 테이블에 id와 price 필드가 있다고 해보자. 모든 가격을 10% 올려보자.

DO $$
DECLARE
    prod RECORD;
BEGIN
    FOR prod IN QUERY (SELECT id, price FROM products) LOOP
        UPDATE products
        SET price = prod.price * 1.1
        WHERE id = prod.id;
    END LOOP;
END $$;

흔한 실수와 피하는 방법

LOOP나 WHILE에서 무한 루프. 만약 종료 조건(EXIT 또는 WHILE의 올바른 조건)을 빼먹으면 루프가 끝나지 않아. 이건 브레이크 없는 차를 모는 거랑 똑같아.

쿼리 결과 순회에서의 실수. 결과 데이터 구조가 예상과 다르면 FOR IN QUERY 루프에서 에러가 날 수 있어.

루프 안에서 비효율적인 쿼리. 예를 들어, 매 반복마다 UPDATE를 실행하면 속도가 엄청 느려질 수 있어. 이런 경우엔 루프 대신 한 번에 처리하는 SQL 쿼리를 쓰는 게 좋아.

2
과제
SQL SELF, 레벨 51, 레슨 1
잠금
`FOR`문을 사용한 쿼리 반복
`FOR`문을 사용한 쿼리 반복
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION