hyeonga_code

Database_84_PL/SQL_제어 구조_반복 제어문 본문

Oracle Database

Database_84_PL/SQL_제어 구조_반복 제어문

hyeonga 2023. 8. 31. 06:59
반응형

-- PL/SQL 제어 구조        

    -- 반복 제어문
        -- LOOP 문
            -- 명령문이나 명령문 시퀀스를 여러 번 반복합니다.
            -- 루프를 종료하려면 EXIT 문을 사용합니다.
            -- 사용하는 경우
                -- 기본 루프 : 루프 안의 명령문이 적어도 한 번 실행되어야 하는 경우
                -- WHILE 루프 : 매번 반복을 시작할 때마다 조건이 평가되어야 하는 경우
                -- FOR 루프 : 반복 횟수를 알 수 있는 경우
            -- 유형
                -- 기본 루프
                    /*
                    LOOP 
                        statement1;
                        . . .
                        EXIT [WHEN condition];
                    END LOOP;
                    */
                    -- 전체 조건 없이 반복 작업을 수행합니다.
                    -- 키워드 LOOP 와 END LOOP 사이에 있는 명령문 시퀀스를 묶습니다.
                    -- 루프를 시작할 때 이미 조건이 만족하더라도 해당 명령문을 적어도 한 번 이상 실행합니다.
                    -- EXIT 문이 없는 경우 끝없이 실행됩니다.
                -- WHILE 루프
                    /*
                    WHILE condition LOOP
                        statement1;
                        statement2; 
                        . . .
                    END LOOP
                    */
                    -- 조건을 기준으로 작업의 반복을 제어합니다.
                    -- 조건이 TRUE 인 동안 명령문을 반복합니다.
                    -- 반복이 시작될 대마다 조건이 평가됩니다.
                    -- 조건이 FALSE 면 루프가 종료됩니다.
                    -- 루프가 시작할 대 조건이 FALSE 인 경우 반복 작업이 더 이상 실행되지 않습니다.
                -- FOR 루프
                    /*
                    FOR counter IN [REVERSE] 
                        lower_bound..upper_bound LOOP 
                        statement1;
                        statement2; 
                        . . .
                    END LOOP;
                    */
                    -- 횟수를 기준으로 작업의 반복을 제어합니다.
                    -- 반복 횟수에 대한 테스트를 단축하려는 경우 사용합니다.
                    -- 카운터는 암시적으로 선언되므로 선언하지 않아도 무관합니다.
                    
    -- 기본 루프
--  국가 코드가 CA이고 도시 이름이 Montreal인 세 개의 새로운 위치 ID를 삽입합니다.
DECLARE
    v_countryid locations.country_id%TYPE := 'CA';
    v_loc_id locations.location_id%TYPE;
    v_counter NUMBER(2) := 1;
    v_new_city locations.city%TYPE := 'Montreal';
BEGIN
    SELECT MAX(location_id) INTO v_loc_id FROM locations
    WHERE country_id = v_countryid;
    LOOP
        INSERT INTO locations(location_id, city, country_id) 
        VALUES((v_loc_id + v_counter), v_new_city, v_countryid);
        v_counter := v_counter + 1;
        EXIT WHEN v_counter > 3;
    END LOOP;
END;
/
    /*
    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

-- 결과를 조회합니다.
SELECT * FROM locations;



    -- WHILE 루프
-- 국가 코드가 CA이고 도시가 Montreal인 세 개의 새로운 위치 ID를 추가합니다.
    -- 카운터가 루프에 지정된 값을 넘어서면 루프를 제어하는 조건이 FALSE로 평가되어 루프가 종료됩니다.
DECLARE
    v_countryid locations.country_id%TYPE := 'CA';
    v_loc_id locations.location_id%TYPE;
    v_new_city locations.city%TYPE := 'Montreal';
    v_counter NUMBER := 1;
BEGIN
    SELECT MAX(location_id) INTO v_loc_id FROM locations
    WHERE country_id = v_countryid;
    WHILE v_counter <= 3 LOOP
        INSERT INTO locations(location_id, city, country_id) 
        VALUES((v_loc_id + v_counter), v_new_city, v_countryid);
        v_counter := v_counter + 1;
    END LOOP;
END;

    /*
    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

-- 결과를 조회합니다.
SELECT * FROM locations;




    -- FOR 루프
-- 국가 코드가 CA이고 도시 이름이 Montreal인 세 개의 새로운 위치 ID를 삽입합니다.
DECLARE
    v_countryid locations.country_id%TYPE := 'CA';
    v_loc_id locations.location_id%TYPE;
    v_new_city locations.city%TYPE := 'Montreal';
BEGIN
    SELECT MAX(location_id) INTO v_loc_id 
    FROM locations
    WHERE country_id = v_countryid;
    FOR i IN 1..3 LOOP
        INSERT INTO locations(location_id, city, country_id) 
        VALUES((v_loc_id + i), v_new_city, v_countryid );
    END LOOP;
END;
/
    /*
    PL/SQL 프로시저가 성공적으로 완료되었습니다.
    */

-- 결과를 조회합니다.
SELECT * FROM locations;

반응형