PL/SQL 제어문

2022-05-09 20:37:58

#database#oracle
  • PL/SQL은 프로그래밍 언어에서 제공하는 다양한 처리문을 제공한다 (조건문,반복문 등)

IF문

  • PL/SQL에서 제공하는 IF문의 구조는 다음과 같다.
-- 조건이 N개일 경우 
IF 조건1 THEN 
    조건 처리1;
ELSIF 조건2 THEN
    조건 처리2;
...
ELSE 
    조건 처리n;
END IF;

IF문 사용예시

DECLARE
    vn_salary NUMBER := 0;
    vn_department_id NUMBER := 0;
BEGIN
    vn_department_id := ROUND(DBMS_RANDOM.VALUE(10,120),-1); -- 10~120까지 난수 생성 후 10의 자리(-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("low value");
    ELSIF vn_salary BETWEEN 3001 AND 6000 THEN 
        DBMS_OUTPUT.PUT_LINE("mid value");
    ELSIF vn_salary BETWEEN 6001 AND 10000 THEN 
        DBMS_OUTPUT.PUT_LINE("high value");
    ELSE 
        DBMS_OUTPUT.PUT_LINE("highest");
    END IF;
END;

CASE 문

CASE WHEN 표현식1 THEN
          처리문1;
     WHEN 표현식2 THEN
          처리문2;
    ...
    ELSE
          기타 처리문;
END CASE;
  • 표현식이 true로 판정되면 처리문을 수행한다.

CASE 문 사용예시

  • IF-ELSIF-ELSE 제어문을 CASE문으로도 표현가능하다.
/***/
CASE WHEN vn_salary BETWEEN 1 AND 3000 THEN 
        DBMS_OUTPUT.PUT_LINE("low value");
    WHEN vn_salary BETWEEN 3001 AND 6000 THEN 
        DBMS_OUTPUT.PUT_LINE("mid value");
    WHEN vn_salary BETWEEN 6001 AND 10000 THEN 
        DBMS_OUTPUT.PUT_LINE("high value");
    ELSE 
        DBMS_OUTPUT.PUT_LINE("highest");
END CASE;
/***/
  • 만약 ELSE 절을 수행할 때 , 아무것도 처리하지 않고 싶은 경우에는 NULL문을 사용한다.
CASE WHEN vn_salary BETWEEN 1 AND 3000 THEN 
        DBMS_OUTPUT.PUT_LINE("low value");
    WHEN vn_salary BETWEEN 3001 AND 6000 THEN 
        DBMS_OUTPUT.PUT_LINE("mid value");
    WHEN vn_salary BETWEEN 6001 AND 10000 THEN 
        DBMS_OUTPUT.PUT_LINE("high value");
    ELSE NULL; -- 아무것도 수행하지 않음
END CASE;

반복문 (LOOP,WHILE,FOR문)

LOOP문

LOOP 
    처리문;
    EXIT [WHEN 조건];
END LOOP;

LOOP문 사용예시

DECLARE 
    vn_base_num NUMBER :=3;
    vn_cnt      NUMBER := 1;
BEGIN 
    LOOP
        DBMS_OUTPUT.PUT_LINE(vn_base_num || "*" || vn_cnt || "= "
                             || vn_base_num * vn_cnt );
        vn_cnt:= vn_cnt+1;
        EXIT WHEN vn_cnt > 9;
    END LOOP;
END;

WHILE문

WHILE 조건
LOOP 
    처리문;
END LOOP;

WHILE 문 사용예시

WHILE vn_cnt <10
LOOP
    DBMS_OUTPUT.PUT_LINE(vn_base_num || "*" || vn_cnt || "= "
                            || vn_base_num * vn_cnt );
    vn_cnt:= vn_cnt+1;
END LOOP;

FOR문 예시

FOR 인덱스 IN [REVERSE] 초깃값..최종값
LOOP
    처리문;
END LOOP;
  • 인덱스값은 초깃값~최종값까지 루프를 돌며 1씩 증가한다.
  • 인덱스값은 참조는 가능하지만 변경할 수 없으며, 참조도 오직 루프 안에서만 가능하다. REVERSE 명시시 순서가 거꾸로 된다.
DECLARE 
    vn_base_num NUMBER := 3;
    vn_cnt      NUMBER := 1;
BEGIN 
    FOR i IN 1..9
    LOOP
        DBMS_OUTPUT.PUT_LINE(vn_base_num || "*" || i || "= "
                             || vn_base_num * i );
    END LOOP;
END;
  • CONTINUE 키워드를 사용하면 바로 조건절로 넘어간다.
BEGIN 
    FOR i IN 1..9
    LOOP
        CONTINUE WHEN i=5;
        DBMS_OUTPUT.PUT_LINE(vn_base_num || "*" || i || "= "
                             || vn_base_num * i );
    END LOOP;
END;
프로필 이미지
@chani
바둑 좋아하는 개발자의 의미있는 학습 기록을 위한 공간입니다.

댓글

이 게시글에 대한 의견을 공유해주세요!

댓글