PL/SQL 제어문

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

IF문

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

IF문 사용예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 문

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

CASE 문 사용예시

  • IF-ELSIF-ELSE 제어문을 CASE문으로도 표현가능하다.
1
2
3
4
5
6
7
8
9
10
11
/***/
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문을 사용한다.
1
2
3
4
5
6
7
8
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문

1
2
3
4
LOOP 
처리문;
EXIT [WHEN 조건];
END LOOP;

LOOP문 사용예시

1
2
3
4
5
6
7
8
9
10
11
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문

1
2
3
4
WHILE 조건
LOOP
처리문;
END LOOP;

WHILE 문 사용예시

1
2
3
4
5
6
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문 예시

1
2
3
4
FOR 인덱스 IN [REVERSE] 초깃값..최종값
LOOP
처리문;
END LOOP;
  • 인덱스값은 초깃값~최종값까지 루프를 돌며 1씩 증가한다.
  • 인덱스값은 참조는 가능하지만 변경할 수 없으며, 참조도 오직 루프 안에서만 가능하다. REVERSE 명시시 순서가 거꾸로 된다.
1
2
3
4
5
6
7
8
9
10
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 키워드를 사용하면 바로 조건절로 넘어간다.
1
2
3
4
5
6
7
8
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;

Comments