반응형

반복문 (LOOP)

BASIC LOOP 기본 반복문

SYNTAX
LOOP
    반복해서 실행해야 할 코드;
    ....
    반드시 루프문을 탈출해야할 코드 존재;
END LOOP ; 
DECLARE
    N NUMBER := 1;
BEGIN
    LOOP
        DBMS_OUTPUT.PUT_LINE(N);
        N := N +1;
        IF N > 5 THEN
            EXIT; -- BREAK 기능을 함. END LOOP로 감.
        END IF;
    END LOOP; 
END;
-- EXIT
- BREAK 기능을 함.
- IF문 또는 EXIT WHEN 조건; 으로 직접 탈출문 기술 가능
FOR LOOP

SYNTAX
FOR 인덱스변수명 IN [REVERSE] 시작값..종료값 LOOP
    실행할 코드 기술;
    ....
    [ 탈출할 코드 기술; ]
END LOOP; 

.. : 범위지정 연산자
**인덱스명 :
- 선언할 필요가 없다.
- 변수처럼 값을 직접 대입받아서 변경하거나 할 수 없다.
- IN뒤의 범위의 값을 자동으로 하나씩 받아서 값을 가지게 되는 변수이다.
- 대소문자 안 가림
DECLARE
    VNUM NUMBER := 3;
BEGIN
    FOR  i IN  1..9 LOOP
        CONTINUE WHEN MOD(i,2)=0;
        --CONTINUE : LOOP머리로 돌아감.
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP; 
END;

--출력값
1
3
5
7
9
--CONTINUE : LOOP머리로 돌아감.
WHILE LOOP

SYNTAX
WHILE 조건 LOOP
    반복으로 실행할 코드들...;
    탈출하기 위한 실행코드;
END LOOP ;
DECLARE
    N NUMBER := 1;
BEGIN
    WHILE N <= 5 LOOP
        DBMS_OUTPUT.PUT_LINE(N);
        N := N + 1;
    END LOOP;
END;

--출력값
1
2
3
4
5
JAVA ORACLE
dan :  --대소문자
for(int i = 2 ; i <=9 ; i++) {
    back ; 
    for(int j = 1; j<=9; j++) {
        System.out.println( i+ "*" + j + "=" ( i * j ));
        if( j > 5 ) break dan ; --라벨for문 밖으로
    }
}
DECLARE
    VNUM NUMBER := 2;
BEGIN
    <<gubun>> --라벨을 붙일 수 있다.
    FOR i In 1..9 LOOP
        DBMS_OUTPUT.PUT_LINE (VNUM||' * '||I||' = '||VNUM*I);
        IF VNUM < 9 AND i = 9 THEN
        VNUM := VNUM +1;
        DBMS_OUTPUT.PUT_LINE ('');
        GOTO GUBUN; --라벨로 돌아가기, 대소문자 구분 안함.
        ELSIF VNUM = 9 AND i = 9 THEN
        EXIT;
        END IF;
    END LOOP;
END;
LOOP 
ex1)
DECLARE
    cnt NUMBER := 1;
    star VARCHAR2(10) := NULL;
BEGIN
    LOOP
        star := star ||'*';
        cnt := cnt+1;
        DBMS_OUTPUT.PUT_LINE(star);
        IF cnt>5 THEN
            EXIT;
        END IF;
    END LOOP;
END;​
*
**
***
****
*****

LOOP 
ex2) 1~10의 합계

DECLARE
    n NUMBER := 1;  -- 1,2,3,4, 5, 6, 7, 8, 9,10
    tot NUMBER :=0; -- 0,1,3,6,10,15,21,28,36,45,55
BEGIN
    LOOP
        tot := tot + n; -->55
        n := n + 1; -->11
        IF n > 10 THEN
            EXIT;
        END IF;
    END LOOP;
    
    DBMS_OUTPUT.PUT_LINE(tot);
END;
55
FOR LOOP
ex1) 1~10숫자값 출력 + 1~10의 합계
DECLARE
    tot NUMBER := 0;
BEGIN
    FOR n IN 1..10 LOOP
        tot := tot + n;
        DBMS_OUTPUT.PUT_LINE(n);
    END LOOP;
     DBMS_OUTPUT.PUT_LINE('tot의 값은: ' ||tot);
END;
1
2
3
4
5
6
7
8
9
10
tot의 값은: 55
FOR LOOP
ex1)
DECLARE
    VDEPT DEPT%ROWTYPE;
BEGIN
    DBMS_OUTPUT.PUT_LINE('부서번호/부서명/지역명');
    DBMS_OUTPUT.PUT_LINE('----------');
    
    FOR CNT IN 1..4 LOOP
        --값이 한 줄 리턴인 경우만 가능
        SELECT DISTINCT * INTO VDEPT FROM DEPT
        WHERE DEPTNO = 10* CNT;
        
        DBMS_OUTPUT.PUT_LINE(VDEPT.DEPTNO||'/'||VDEPT.DNAME||'/'||VDEPT.LOC);
    END LOOP;
END;​
부서번호/부서명/지역명
----------
10/ACCOUNTING/NEW YORK
20/RESEARCH/DALLAS
30/SALES/CHICAGO
40/OPERATIONS/BOSTON
구구단
DECLARE
    VNUM NUMBER := 2;
BEGIN
    <<gubun>> --라벨을 붙일 수 있다.
    FOR i In 1..9 LOOP
        DBMS_OUTPUT.PUT_LINE (VNUM||' * '||I||' = '||VNUM*I);
        IF VNUM < 9 AND i = 9 THEN
        VNUM := VNUM +1;
        DBMS_OUTPUT.PUT_LINE ('');
        GOTO GUBUN; --라벨로 돌아가기, 대소문자 구분 안함.
        ELSIF VNUM = 9 AND i = 9 THEN
        EXIT;
        END IF;
    END LOOP;
END;​
2 * 1 = 2
2 * 2 = 4
.
.
.
9 * 9 = 81
홀짝홀짝...
DECLARE
    VNUM NUMBER := 2;
BEGIN
<<even>> --짝수
    LOOP
        IF MOD(VNUM,2) = 0 THEN
            DBMS_OUTPUT.PUT_LINE (VNUM||'는 짝수');
            VNUM := VNUM +1;
        ELSE
            GOTO ODD;
        END IF;
        
        IF VNUM =10 THEN EXIT;
        END IF;
    END LOOP;
    
<<odd>> --홀수
    LOOP
        IF MOD(VNUM,2) = 1 THEN
            DBMS_OUTPUT.PUT_LINE (VNUM||'는 홀수');
            VNUM := VNUM +1;
        ELSE
            GOTO EVEN;
        END IF;
        
        IF VNUM =10 THEN EXIT;
        END IF;
    END LOOP;
END;​
2는 짝수
3는 홀수
4는 짝수
5는 홀수
6는 짝수
7는 홀수
8는 짝수
9는 홀수
반응형

'[ORACLE]' 카테고리의 다른 글

[ORACLE] PROCEDURE --테이블 백업용 프로시저  (0) 2024.01.29
[ORACLE] PL/SQL - NDS  (1) 2024.01.25
[ORACLE] PL/SQL - ANOYMOUS BLOCK,  (0) 2024.01.24
[ORACLE] 집합연산자 UNION, UNION ALL, INTERSECT, MINUS  (0) 2024.01.24
[ORACLE] MERGE  (0) 2024.01.23

+ Recent posts