Data Base/PL SQL

231026 PL/SQL 반복문(CONTINUE문, WHILE LOOP문, FOR)

잇꼬 2023. 10. 26. 15:42
728x90
반응형
SMALL

# CONTINUE 문 현재 루프를 종료하고 다음 루프로 반복하는 문

DECLARE
    i NUMBER := 1;
BEGIN
    LOOP
        IF i = 4 OR i = 8 THEN
            i := i + 1;
            CONTINUE; -- CONTINUE: 다시 반복
        ELSE
            dbms_output.put_line(i);
        END IF;
        i := i + 1;
        IF i > 10 THEN
            EXIT;
        END IF;
    END LOOP;
END;
/



# IF 조건문으로 CONTINUE WHEN 절로 변경

DECLARE
    i NUMBER := 0;
BEGIN
    LOOP
        i := i + 1;
        CONTINUE WHEN i = 4 or i = 8; 
        dbms_output.put_line(i);
        EXIT WHEN i = 10;
    END LOOP;
END;
/


■ WHILE LOOP 문

DECLARE 
    i number := 1;
BEGIN
    WHILE i <= 10 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
        i := i + 1;
    END LOOP;
END;
/



[문제] 1부터 10 까지 출력해주세요. 단, 4와 8 은 제외하고.

방법1)

DECLARE 
    i number := 1;
BEGIN
    WHILE i <= 10 LOOP
        IF i != 4 and i != 8 THEN
            DBMS_OUTPUT.PUT_LINE(i);
        END IF;
        i := i + 1;
    END LOOP;
END;
/


방법2)

DECLARE 
    i number := 1;
BEGIN
    WHILE i <= 10 LOOP
        IF i = 4 or i = 8 THEN
            i := i +1;
            CONTINUE; 
        ELSE    
            DBMS_OUTPUT.PUT_LINE(i);
        END IF;
        i := i + 1;
    END LOOP;
END;
/


# 1부터 100까지의 합 : LOOP문을 WHILE LOOP문으로 변경

DECLARE
    v_cnt number := 1; -- 1부터 시작
    v_sum number := 0; -- 누적합
BEGIN
    WHILE v_cnt <= 100 LOOP
        v_sum := v_sum+v_cnt;
        v_cnt := v_cnt+1;
    END LOOP;
        dbms_output.put_line('1부터 100까지의 합 : '||v_sum);
END; 
/


■ FOR 문 
- 반복횟수(자동)를 알고 있을 때 사용하는 루프문 

# FOR 변수명 IN 숫자.. 숫자 : 구간 설정

BEGIN
    FOR i IN 1.. 10 LOOP -- 변수명 IN 숫자.. 숫자 : 구간 설정
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
/

# 조건문, 제어문 

BEGIN
    FOR i IN 1.. 10 LOOP -- 변수명 IN 숫자.. 숫자 : 구간 설정
        CONTINUE WHEN i = 4; -- 4를 제외
        DBMS_OUTPUT.PUT_LINE(i);
        EXIT WHEN i = 5; -- 5까지 출력
    END LOOP;
END;
/


# FOR 변수명 IN 변수명 .. 변수명 

DECLARE
    v_start number := 1; 
    v_end number := 10;
BEGIN
    FOR i IN v_start .. v_end LOOP -- 변수명 IN 변수명 .. 변수명 : 구간 설정
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
/


# 구간설정할 때에는 NULL 설정 할때 
- 오류발생 ORA-06502: PL/SQL: numeric or value error

DECLARE
    v_start number := 1; 
    v_end number := NULL;
BEGIN
    FOR i IN v_start .. v_end LOOP 
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;
/


# LOOP 문을 FOR 문으로 변경
1) 100까지의 합

DECLARE
    v_cnt number := 1; -- 1부터 시작
    v_sum number := 0; 
BEGIN
    FOR v_cnt IN 1..100 LOOP
        v_sum := v_sum+v_cnt;
    END LOOP;
        dbms_output.put_line('1부터 100까지의 합 : '||v_sum);
END; 
/


2) 4, 8 을 제외 
방법A)

DECLARE 
    i number := 1;
BEGIN
    FOR i IN 1..10 LOOP
        IF i != 4 and i != 8 THEN
            DBMS_OUTPUT.PUT_LINE(i);
        END IF;
    END LOOP;
END;
/


방법B)

DECLARE 
    i number := 1;
BEGIN
    FOR i IN 1..10 LOOP
        IF i = 4 or i = 8 THEN
            -- i := i + 1; 오류발생_카운트 변수에 다른 값을 변경할 수 없다.
            CONTINUE; 
        ELSE    
            DBMS_OUTPUT.PUT_LINE(i);
        END IF;
    END LOOP;
END;
/


[문제] 2단을 출력해 주세요.


1) 기본 LOOP문

DECLARE
    a number := 0; -- NUM
    b number := 2; -- DAN
    c number := 1; -- 결과값
BEGIN 
    LOOP
        a := a+1;
        c := a*b;
        DBMS_OUTPUT.PUT_LINE(a||'*'||b||'='||c);
        EXIT WHEN a = 9;
    END LOOP;
END;
/

정답)

DECLARE
    i number := 1;
BEGIN 
    LOOP
        DBMS_OUTPUT.PUT_LINE('2 * '|| i ||' = '|| 2*i);
        EXIT WHEN i = 9;
        i := i+1;
    END LOOP;
END;
/


2) while loop문

DECLARE
    a number := 1; -- NUM
    b number := 2; -- DAN
    c number := 1; -- 결과값
BEGIN 
    WHILE a <= 9 LOOP
        c := a*b;
        DBMS_OUTPUT.PUT_LINE(a||'*'||b||'='||c);
        a := a+1;
    END LOOP;
END;
/


정답)

DECLARE
    i number := 1;
BEGIN 
    while i <= 9 LOOP
        DBMS_OUTPUT.PUT_LINE('2 * '|| i ||' = '|| 2*i);
        i := i+1;
    END LOOP;
END;
/


3) for loop문 

declare
    a number := 1; 
    b number := 2;
    c number := 1;
begin 
    FOR A IN 1..9 LOOP
        c := a*b;
        DBMS_OUTPUT.PUT_LINE(a||'*'||b||'='||c);
    END LOOP;
end;
/


정답) 

BEGIN 
    for i in 1..9 LOOP
        DBMS_OUTPUT.PUT_LINE('2 * '|| i ||' = '|| 2*i);
    END LOOP;
END;
/


[문제] 구구단 출력하세요.


1) 기본 LOOP문

DECLARE
    dan number := 2; 
    j number; --기수 변수
BEGIN
    LOOP -- dan 반복문 (main loop)
        j := 1;
        LOOP -- 기수 LOOP문 (sub loop)
            dbms_output.put_line(dan||' * '||j||' = '||dan*j);
            EXIT WHEN j = 9;
            j := j +1;
        END LOOP; -- 기수 LOOP문 end
            EXIT WHEN dan = 9;
            dan := dan + 1;
    END LOOP; -- dan LOOP문 end
END;
/


2) WHILE LOOP문

DECLARE
    dan number := 2; 
    j number; --기수 변수
BEGIN
    WHILE dan <= 9 LOOP -- dan 반복문 (main loop)
        j := 1;
        WHILE j <= 9 LOOP -- 기수 LOOP문 (sub loop)
            dbms_output.put_line(dan||' * '||j||' = '||dan*j);
            j := j +1;
        END LOOP; -- 기수 LOOP문 end
            dan := dan + 1;
    END LOOP; -- dan LOOP문 end
END;
/


3) FOR문 

BEGIN
    FOR dan IN 2..9 LOOP -- dan 반복문 (main loop)
        FOR j IN 1..9 LOOP -- 기수 반복문 (sub loop)
            dbms_output.put_line(dan||' * '||j||' = '||dan*j);
        END LOOP; -- 기수 LOOP문 end
    END LOOP; -- dan LOOP문 end
END;
/


[문제] 급여를 입력값을 받아서 1000당 * 하나를 출력해주세요

<화면 출력>
급여는 5500 당신의 별은 ***** 


방법1) 

(Run SQL Command Line)

set SERVEROUTPUT ON
L
var b_sal number
execute :b_sal :=5500
print :b_sal

DECLARE
    v_num number := trunc(:b_sal/1000);
    v_star varchar2(20);
BEGIN
    FOR i IN 1.. v_num LOOP 
        v_star := v_star||'*';        
    END LOOP;
        dbms_output.put_line('급여는 '||:b_sal||' 당신의 별은  '||v_star);
END;
/


방법2)

DECLARE
    v_sal number := 5500;
    v_num number := trunc(v_sal/1000);
    v_str varchar2(10) := NULL;
BEGIN
    FOR i IN 1.. v_num LOOP
        v_str := v_str||'*';
    END LOOP;
        dbms_output.put_line('급여는 '||v_sal||' 당신의 별은 '||v_str);
END;
/

728x90
반응형
LIST