[Oracle] PL/SQL 기초2 - 반복문 (FOR LOOP, LOOP, WHILE LOOP) 및 제어문 (IF, CASE)
안녕하세요. 갓대희 입니다. 이번 포스팅은 [ PL / SQL 반복문, 제어문 ] 입니다. : )
1. 반복문
PL / SQL 에서도 반복문을 사용할 수 있는데, 크게는 2가지로 볼 수 있다. (LOOP, FOR)
▶ 1.1 FOR LOOP
[문법]
FOR index in [REVERSE] 시작값 .. END값 LOOP
STATEMENT 1
STATEMENT 2
...
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문
[문법]
LOOP
PL/SQL STATEMENT 1
다른 LOOP를 포함하여 중첩으로 사용 가능
EXIT [WHEN CONDITION]
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
[문법]
IF 조건1 THEN
처리문1
ELSE IF 조건2 THEN
처리문2
...
ELSE
처리문
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
[문법]
CASE WHEN 조건1 THEN
처리문1
WHEN 조건2 THEN
처리문2
...
ELSE
처리문
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 - 커서