ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PL/SQL] 기초 문법
    IT, 프로그래밍/Database (Oracle) 2019. 1. 16. 09:18

    반복문




    LOOP, WHILE, FOR




    1. LOOP


    LOOP

    처리문

    EXIT [WHEN 조건];

    END LOOP;



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DECLARE
      vs_gugu_line number := 1;
      vs_gugu_col number :=1;
    BEGIN
      LOOP
        DBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');
        vs_gugu_col := 1;
        LOOP 
            DBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));
            vs_gugu_col := vs_gugu_col + 1;
            EXIT WHEN vs_gugu_col > 9;
            END LOOP;
        vs_gugu_line := vs_gugu_line +1;
        EXIT WHEN vs_gugu_line > 9;
      END LOOP;
    END;
    cs



    이중 LOOP문을 사용하여 구구단을 출력하는 예제.




    2. WHILE


    WHILE 조건

    LOOP

    처리문;


    END LOOP;




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    DECLARE
      vs_gugu_line number := 1;
      vs_gugu_col number :=1;
    BEGIN
      WHILE vs_gugu_line < 10
      LOOP
        DBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');
        vs_gugu_col := 1;
        WHILE vs_gugu_col < 10
        LOOP 
            DBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));
            vs_gugu_col := vs_gugu_col + 1;
            END LOOP;
        vs_gugu_line := vs_gugu_line +1;
      END LOOP;
    END;
    cs



    WHILE문은 LOOP문의 EXIT WHEN 조건을 위로 올린 것과 같다.

    단, WHILE문에 적어주는 조건은 반복 조건 ( ~~ 조건을 만족할 시에 반복하라),

    LOOP문에 적어주는 조건은 탈출 조건 ( ~~조건을 만족할 시에 탈출하라) 이므로 유의하여야 한다.



    3. FOR 


    FOR 인덱스 IN [REVERSE] 초깃값..최종값

    LOOP

    처리문;


    END LOOP;


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
     
    BEGIN
      FOR vs_gugu_line IN 1..9
      LOOP
        DBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');
        FOR vs_gugu_col IN 1..9
        LOOP 
            DBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));
            END LOOP;
      END LOOP;
    END;
    cs



    초기값과 최종값을 지정해준다.. LOOP나 WHILE보다 가독성도 좋고 편하게 사용할 수 있다.



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


    1단 입니다.

    1 * 1 = 1

    1 * 2 = 2

    1 * 3 = 3

    1 * 4 = 4

    1 * 5 = 5

    ........

    9 * 4 = 36

    9 * 5 = 45

    9 * 6 = 54

    9 * 7 = 63

    9 * 8 = 72

    9 * 9 = 81




    REVERSE 옵션을 사용할 수 있는데 이걸 사용하면 최종값부터 초기값까지 하나씩 감소하면서 반복한다.




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE

    BEGIN
      FOR vs_gugu_line IN REVERSE 1..9
      LOOP
        DBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');
        FOR vs_gugu_col IN REVERSE 1..9
        LOOP 
            DBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));
            END LOOP;
      END LOOP;
    END;
     
    cs



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


    9단 입니다.

    9 * 9 = 81

    9 * 8 = 72

    9 * 7 = 63

    9 * 6 = 54

    9 * 5 = 45

    ...

    1 * 6 = 6

    1 * 5 = 5

    1 * 4 = 4

    1 * 3 = 3

    1 * 2 = 2

    1 * 1 = 1










    조건문




    IF, CASE





    1. IF THEN ~ ELSIF THEN ~ ELSE 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE
        vs_a NUMBER := 1;
        vs_b NUMBER := 2;
    BEGIN
        IF vs_a = vs_b THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 b와 같습니다');
        ELSIF vs_a = THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 3입니다');
        ELSE SYS.DBMS_OUTPUT.PUT_LINE('a는 3이 아닙니다');
        END IF;
    END;
    cs


    a는 3이 아닙니다




    2. CASE


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE
        vs_a NUMBER := 1;
        vs_b NUMBER := 2;
    BEGIN
        CASE 
        WHEN vs_a = vs_b THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 b와 같습니다');
        WHEN vs_a = THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 3입니다');
        ELSE SYS.DBMS_OUTPUT.PUT_LINE('a는 3이 아닙니다');
        END CASE;
    END;
    cs


    a는 3이 아닙니다




    IF와 CASE는 매우 유사한 문법을 가지고 있다.






    기타 문법







    1. CONTINUE문


    반복문 내에서 특정 조건에 걸릴 때 처리 로직을 건너 뛰고 상단의 루프 조건으로 건나가 루프를 계속 수행할 때 사용


    (오라클 11g부터 지원)



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
     
    BEGIN
      FOR vs_gugu_line IN 1..9
      LOOP
        DBMS_OUTPUT.PUT_LINE( vs_gugu_line || '단 입니다.');
        FOR vs_gugu_col IN 1..9
        LOOP 
            CONTINUE WHEN vs_gugu_col > 3;
            DBMS_OUTPUT.PUT_LINE(vs_gugu_line || ' * ' || vs_gugu_col || ' = ' || (vs_gugu_line * vs_gugu_col));
            END LOOP;
      END LOOP;
    END;
    cs

    1단 입니다.

    1 * 1 = 1

    1 * 2 = 2

    1 * 3 = 3

    2단 입니다.

    2 * 1 = 2

    2 * 2 = 4

    2 * 3 = 6


    ...


    8단 입니다.

    8 * 1 = 8

    8 * 2 = 16

    8 * 3 = 24

    9단 입니다.

    9 * 1 = 9

    9 * 2 = 18

    9 * 3 = 27




    2. GOTO문



    GOTO를 선언하고 라벨을 지정해 주면 그 라벨로 넘어간다 (jump 한다!)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    DECLARE
      vs_gugu_line number := 0;
    BEGIN
      FOR i IN 1..9
      LOOP
        DBMS_OUTPUT.PUT_LINE( i || '단 입니다.');
        IF i = THEN vs_gugu_line := i; GOTO printing; END IF;
        FOR j IN 1..9
        LOOP 
            DBMS_OUTPUT.PUT_LINE(i || ' * ' || j || ' = ' || (i * j));
            END LOOP;
      END LOOP;
      
      <<printing>>
      DBMS_OUTPUT.PUT_LINE('GOTO로 이동한 라인은... ' || vs_gugu_line || ' 입니다...');
      
    END;
    cs



    1단 입니다.

    1 * 1 = 1

    1 * 2 = 2

    1 * 3 = 3

    1 * 4 = 4

    1 * 5 = 5

    1 * 6 = 6

    1 * 7 = 7

    1 * 8 = 8

    1 * 9 = 9

    2단 입니다.

    GOTO로 이동한 라인은... 2 입니다...




    GOTO문은 프로그램 수행의 일관성을 해칠 수 있어서, 나중에 유지보수가 매우 힘들어 질 수 있다. 그러므로 사용을 지양하자. 




    3. NULL문


    1
    2
     IF vs_a = vs_b THEN SYS.DBMS_OUTPUT.PUT_LINE('a는 b와 같습니다');
        ELSE NULL;
    cs


    IF문이나 CASE문 작성시 아무것도 지정하지 않으려면 NULL을 선언.

Designed by Tistory.