본문으로 바로가기
반응형

[Oracle] PL/SQL 기초2 - 반복문 (FOR LOOP, LOOP, WHILE LOOP) 및 제어문 (IF, CASE)


안녕하세요. 갓대희 입니다. 이번 포스팅은 [ PL / SQL 반복문, 제어문 ] 입니다. : ) 






1. 반복문


PL / SQL 에서도 반복문을 사용할 수 있는데, 크게는 2가지로 볼 수 있다. (LOOP, FOR)


▶ 1.1 FOR LOOP


[문법]


  1. FOR index in [REVERSE] 시작값 .. END값 LOOP
  2.     STATEMENT 1
  3.     STATEMENT 2
  4.     ...
  5. END LOOP;



- index는 자동 선언되는 binary_integer형 변수이고, 1씩 증가 한다.

- REVERSE 옵션이 사용 될 경우 index 는 upper_bound에서 lower_bound로 1씩 감소 한다.

- IN 다음에는 coursor나 select 문이 올 수 있다.




EX 1) 


SET serveroutput ON;

BEGIN

FOR i in 1..4 LOOP

  if mod(i, 2) = 0 then 

dbms_output.put_line( i || '는 짝수!!');

else

dbms_output.put_line( i || '는 홀수!!');

end if;

END LOOP;

END;





EX 2) 간단한 FOR 문안에 SELECT 문이 오는 예제

       (이부분은 사실 cursor 예제인데 뒤에서 더 자세히 설명)


SET serveroutput ON;

BEGIN

FOR NUM_LIST IN 

    (

        SELECT 1 AS NUM FROM DUAL

        UNION ALL

        SELECT 2 AS NUM FROM DUAL

        UNION ALL

        SELECT 3 AS NUM FROM DUAL

        UNION ALL

        SELECT 4 AS NUM FROM DUAL

    )

    LOOP

  if mod(NUM_LIST.NUM, 2) = 0 then 

dbms_output.put_line( NUM_LIST.NUM || '는 짝수!!');

else

dbms_output.put_line( NUM_LIST.NUM || '는 홀수!!');

end if;

END LOOP;

END;



 - 중간에 다음과 같은 SELECT 문을 그냥 단순 조회하면 다음과 같은 테이블의 결과가 나온다.


 - 전체 PL/SQL에 대한 결과!



▶ 1.2 LOOP문


[문법]


  1. LOOP 
  2.     PL/SQL STATEMENT 1
  3.        다른 LOOP를 포함하여 중첩으로 사용 가능
  4.     EXIT [WHEN CONDITION]
  5. END LOOP;



EXIT 문이 사용되었을 경우, 무조건 LOOP문을 빠져나간다.

- EXIT WHEN 조건이 사용될 경우 WHEN절에서 LOOP를 빠져나가는 조건을 제어할 수 있다.



EX 1) 기본 LOOP문 예제


SET serveroutput ON;

DECLARE

    v_num NUMBER := 6; -- 시작숫자

    v_tot_num NUMBER := 0; -- 총 loop수 반환 변수

BEGIN

    LOOP

        DBMS_OUTPUT.PUT_LINE('현재 숫자 : ' || v_num);

        v_num := v_num + 1;

        v_tot_num := v_tot_num + 1;

        EXIT WHEN v_num > 10;

    END LOOP;

    

    DBMS_OUTPUT.PUT_LINE(v_tot_num || '번의 LOOP');

END;




EX 2) WHILE LOOP문 예제


SET serveroutput ON;

DECLARE

    v_num NUMBER := 6; -- 시작숫자

    v_tot_num NUMBER := 0; -- 총 loop수 반환 변수

BEGIN

    WHILE v_num < 11 LOOP

        DBMS_OUTPUT.PUT_LINE('현재 숫자 : ' || v_num);

        v_num := v_num + 1;

        v_tot_num := v_tot_num + 1;

        -- EXIT WHEN v_num > 10;

    END LOOP;

    DBMS_OUTPUT.PUT_LINE(v_tot_num || '번의 LOOP');

END;





2. 제어문


알반적인 프로그래밍에서 사용되는 IF문, CASE문 등의 제어문(조건절)을 PL/SQL에서도 사용할 수 있다.


▶ 2.1 IF


[문법]


  1. IF 조건1 THEN
  2.     처리문1
  3. ELSE IF 조건2 THEN
  4.     처리문2
  5.     ...
  6. ELSE
  7.     처리문
  8. END IF;



- IF문은 조건값이 참이면 해당 조건의 처리문장이 실행된다.

- 다른 프로그래밍 IF 문과 다른점

1. 조건 다음에 THEN을 붙인다.

2. 보통 ELSE IF(ELSE와 IF 사이 공백 존재)를 쓰지만, PL/SQL에서는 ELSIF(공백 없음) 명령어를 사용한다.

3. 마지막에는 IF를 끝낸다는 END IF를 붙인다.



EX 1) 기본 IF문 예제


DECLARE

    v_score NUMBER := 79;

BEGIN

  IF v_score >= 90 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : A');

  ELSIF v_score >= 80 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : B');

  ELSIF v_score >= 70 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : C');

  ELSIF v_score >= 60 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : D');

  ELSE

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : F');

  END IF;

END;



EX 2) IF문 예제2 - 조건이 NULL인경우 

 - NULL의 비교는 항상 NULL이기 때문에, ELSE 이하 문만 수행된다.


DECLARE

    v_score NUMBER;

BEGIN

  IF v_score >= 90 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : A');

  ELSIF v_score >= 80 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : B');

  ELSIF v_score >= 70 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : C');

  ELSIF v_score >= 60 THEN

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : D');

  ELSE

    DBMS_OUTPUT.PUT_LINE('점수 : ' || v_score || ', 등급 : F');

  END IF;

END;




▶ 2.2 CASE


[문법]


  1. CASE WHEN 조건1 THEN
  2.     처리문1
  3. WHEN 조건2 THEN
  4.     처리문2
  5.     ...
  6. ELSE
  7.     처리문
  8. END CASE;



- 오라클 CASE문과 PL/SQL CASE문은 거의 비슷하다.

CASE 표현식조건문을 알아보도록 하자.


EX 1) CASE 표현식 예제

 - 단순하게 조건문에 따른 값을 대입할 때 사용한다.


DECLARE

    v_grade     CHAR(1) := 'C';

    v_appraisal VARCHAR2(20) ;

BEGIN

  v_appraisal := CASE v_grade

  WHEN 'A' THEN 'Excellent'

  WHEN 'B' THEN 'Very Good'

WHEN 'C' THEN 'Good'

ELSE 'No such grade'

  END;

  DBMS_OUTPUT.PUT_LINE ('Grade : '|| v_grade) ;

  DBMS_OUTPUT.PUT_LINE ('Appraisal: '|| v_appraisal);

END;





EX 2) CASE 조건문 예제

 - 단순한 값이 아닌 PL/SQL문 (명령문)을 실행 시키고자 하는 경우에 CASE 조건문을 사용해야 한다. 

 - CASE 조건문은 끝이 END CASE로 끝난다.


DECLARE

    v_grade     CHAR(1) := 'C';

    v_appraisal VARCHAR2(20) ;

BEGIN

  CASE v_grade

  WHEN 'A' THEN

  v_appraisal := 'Excellent';

  WHEN 'B' THEN

    v_appraisal := 'Very Good';

  WHEN 'C' THEN

    v_appraisal := 'Good';

  ELSE

    v_appraisal := 'No such grade';

  END CASE;

  DBMS_OUTPUT.PUT_LINE ('Grade : '|| v_grade) ;

  DBMS_OUTPUT.PUT_LINE ('Appraisal: '|| v_appraisal);

END;






혹시 기본 pl/sql 문법이 궁금하다면 다음글 참고


2018/05/24 - [Database/Oracle 기본] - [Oracle] PL/SQL 기초 (정의, 특징, 사용방법, 변수선언 방법)



2018/06/14 - [4. Database/4_3 Oracle 기본] - [Oracle] PL/SQL 기초3 - 커서





반응형

댓글을 달아 주세요

  1. 송바 2020.09.09 17:26

    안녕하세요. 작성해주신 프로시저 관련 자료 잘 보고 있습니다. 변수마다 v_ 가 붙어 있는데 이건 따로 변수 명명 규칙이 있는건가요? 아니면 대희님의 개인적인 코딩 습관이신건가요? 변수를 선언할 때 지켜야할 규칙 같은게 있나 궁금합니다.

    • Favicon of https://goddaehee.tistory.com BlogIcon 갓대희 2020.09.10 13:37 신고

      아.. 저와 같은 경우는 변수는 V_, 파라미터는 P_ 와같이 작성하여 구분하고 있었을 것 같아요.

      규칙은 아니지만, 저런식으로 구분하여 작성하면 아마 추후 해당 프로시저를 잘 모르는 다른 사람들이 추후 유지보수, 수정 할때
      얼추 의미나 뜻을 이해 하기 조금더 쉬우라고 암묵적으로 사용하고 있었습니다.

      업무시 다른분들도 이런식으로 많이 사용하고 있다보니, 그냥 이렇게 사용하긴 했지만, 조금이나마 다른 사람들과 협업시 도움이 되지 않을까 ... 하네요 ㅋㅋㅋ

    • BlogIcon 송바 2020.09.14 09:16

      친절한 답글 감사합니다. 게시글 잘 챙겨보고 있습니다.