오라클 BEGIN END 문 - olakeul BEGIN END mun

FOR문

FOR문도 다른 프로그래밍 언어에서 사용하는 것과 비슷한 형태이다. 오라클에서 제공하는 FOR문의 기본 유형은 다음과 같다.

    FOR 인덱스 IN [REVERSE]초깃값..최종값
    LOOP
      처리문;
    END LOOP;

인덱스는 초깃값에서 시작해 최종값까지 루프를 돌며 1씩 증가되는데, 인덱스는 참조는 가능하지만 변경할 수는 없고 참조도 오직 루프 안에서만 가능하다. 그리고 REVERSE를 명시하면 순서가 거꾸로 된다. 즉 최종값부터 시작해 최솟값에 이르기까지 감소하면서 루프를 돈다. 구구단 3단을 출력하는 익명 블록을 FOR문으로 변경해 보자.

입력

    DECLARE
      vn_base_num NUMBER := 3;
    BEGIN
       FOR i IN 1..9
       LOOP
          DBMS_OUTPUT.PUT_LINE (vn_base_num || '*' || i || '= ' || vn_base_num * i);
       END LOOP;
    END;

FOR 루프에서 사용하는 인덱스는 선언부에서 선언하지 않고 사용했음을 유념하자. 이번에는 REVERSE를 사용해 순서를 바꿔 보자.

입력

    DECLARE
       vn_base_num NUMBER := 3;
    BEGIN
       FOR i IN REVERSE 9..1
       LOOP
          DBMS_OUTPUT.PUT_LINE (vn_base_num || '*' || i || '= ' || vn_base_num * i);
       END LOOP;
    END;

결과

    3*9= 27
    3*8= 24
    3*7= 21
    3*6= 18
    3*5= 15
    3*4= 12
    3*3= 9
    3*2= 6
    3*1= 3

지금까지 기본 형태의 FOR문을 살펴봤는데, 커서와 함께 FOR문을 사용하면 그 형태가 약간 다르다. 이에 대해서는 커서를 다루는 장에서 설명하겠다.

신간 소식 구독하기

뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.

IF문

특정 조건에 따라 처리를 하는 것을 조건문이라 하는데 그 대표적인 것이 바로 IF 문이며 그 구조는 다음과 같다.

    <조건이 1개일 경우>
    IF 조건 THEN
       조건 처리;
    END IF;
     
    <조건이 2개일 경우>
    IF 조건 THEN
       조건 처리 1;
    ELSE
      조건 처리2;
    END IF;
     
    <조건이 n개일 경우>
    IF 조건1 THEN
       조건 처리1;
    ELSIF 조건2 THEN
      조건 처리2;
      ...
    ELSE
       조건 처리n;
    END IF;

IF 다음에 오는 조건 값이 참, 즉 TRUE이면 해당 조건 처리 문장이 실행된다. IF문의 용법은 프로그래밍 언어에 따라 조금씩 차이가 있는데 오라클에서는 조건 다음에는 THEN을, 문장 맨 마지막에는 END IF를 명기해야 한다. 또한 조건이 1개 이상이면 ELSE IF가 아닌 ELSIF를 사용한다. 그럼 두 변수를 선언해 초기화한 뒤 둘 중 큰 수를 출력하는 로직을 IF문을 사용해 구현해 보자.

입력

    DECLARE
      vn_num1 NUMBER := 1;
      vn_num2 NUMBER := 2 ;
    BEGIN
      IF vn_num1 >= vn_num2 THEN
         DBMS_OUTPUT.PUT_LINE(vn_num1 ||'이 큰 수');
      ELSE
         DBMS_OUTPUT.PUT_LINE(vn_num2 ||'이 큰 수');
      END IF;
    END;

결과

    2이 큰 수

vn_num2가 vn_num1보다 크므로 ELSE 부분으로 제어가 넘어가 실행된 것을 확인할 수 있다. 이번에는 조건이 여러 개인 IF문을 살펴 보자.

입력

    DECLARE
      vn_salary NUMBER := 0;
      vn_department_id NUMBER := 0;
    BEGIN
      vn_department_id := ROUND(DBMS_RANDOM.VALUE (10, 120), -1);

       SELECT salary
         INTO vn_salary
         FROM employees
        WHERE department_id = vn_department_id
          AND ROWNUM = 1;

      DBMS_OUTPUT.PUT_LINE(vn_salary);

      IF vn_salary BETWEEN 1 AND 3000 THEN
         DBMS_OUTPUT.PUT_LINE('낮음');
      ELSIF vn_salary BETWEEN 3001 AND 6000 THEN
         DBMS_OUTPUT.PUT_LINE('중간');
      ELSIF vn_salary BETWEEN 6001 AND 10000 THEN
         DBMS_OUTPUT.PUT_LINE('높음');
      ELSE
         DBMS_OUTPUT.PUT_LINE('최상위');
      END IF;
    END;

결과

    13000
    최상위

앞의 익명 블록은 7장에서 샘플 데이터를 생성할 때 사용했던 DBMS_RANDOM 패키지를 사용해 10부터 120까지 숫자를 생성한 후 10의 자리(-1)에서 ROUND 처리를 해서 실행할 때마다 무작위로 10, 20, 30, … 120까지 수를 vn_department_id 변수에 할당한다. 이로 인해 이 PL/SQL 블록의 실행 결과는 실행할 때마다 달라질 것이다. 그리고 나서 이 변수 값에 해당하는 부서번호를 가진 사원을 무작위로 1명 선택해 급여를 가져와 vn_salary 변수에 넣어, IF 문을 사용해 범위에 맞게 출력하는 로직이다. 급여가 3000 이하이면 ‘낮음’, 3,001에서 6,000까지는 ‘중간’, 6,001에서 10,000까지는 ‘높음’, 그 이상은 ‘최상위’ 라는 텍스트를 출력하고 있다. 이처럼 여러 조건을 검토해 로직을 처리할 때는 IF~ELSIF~ELSE~END IF 구문을 사용한다.

또한 IF문을 중첩해서 사용할 수도 있다. 중첩할 때는 가장 가까운 IF 조건에 따라 로직이 처리된다.

입력

    DECLARE
      vn_salary NUMBER := 0;
      vn_department_id NUMBER := 0;
      vn_commission NUMBER := 0;
    BEGIN
      vn_department_id := ROUND(DBMS_RANDOM.VALUE (10, 120), -1);

       SELECT salary, commission_pct
         INTO vn_salary, vn_commission
         FROM employees
        WHERE department_id = vn_department_id
          AND ROWNUM = 1;

      DBMS_OUTPUT.PUT_LINE(vn_salary);

      IF vn_commission > 0 THEN
        IF vn_commission > 0.15 THEN
           DBMS_OUTPUT.PUT_LINE(vn_salary * vn_commission );
        END IF;
      ELSE
         DBMS_OUTPUT.PUT_LINE(vn_salary);
      END IF;
    END;

결과

    6500
    6500

위 익명 블록은 사원 테이블에서 커미션까지 가져와 커미션이 0보다 클 경우, 다시 조건을 걸어 커미션이 0.15보다 크면 ‘급여*커미션’ 결과를 출력하고, 커미션이 0보다 작으면 급여만 출력하고 있다.

신간 소식 구독하기

뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.

Procedural Language Extention to SQL 의 약자로 오라클 자체에 내장되어있는 절차적언어로서 SQL의 단점을 보완.
변수정의, 조건처리(IF), qksqhrcjfl (LOOP,WHILE,FOR)등을 지원.

[선언부] 변서나 상수 선언 
[실행부] 제어,반목분, 항수정의 등 로직 기술가능 
[예외처리부] 에러 발생히 해결할 문장 기술

※SET SERVEROUTPUT ON 
--오라클에서 제공하는 프로시저를 사용하여 출력하는 내용을 화면에 보여주도록 하는 환경변수 
--디폴트값이 OFF이기때문에 ON으로 변경해야함 


* := 는 대입, = 는 값비교 (자바에서의 =와 == 처럼) 
  
* 선언부, 실행부
DECLARE   --[선언부] 변서나 상수 선언 
vempno number(4); 
vename varchar2(10); 

BEGIN   --[실행부] 제어,반목분, 항수정의 등 로직 기술가능 
vempno := 999; 
vename := '조수현'; 
DBMS_OUTPUT.PUTLINE(vempno||'-'||vename); 
END; 
/

* := 는 대입, = 는 값비교 ( JAVA에서의 =와 == 처럼) 

출처: https://jyosssss.tistory.com/33 [개미는 뜐뜐]