PL/SQL에서의 반복문은 크게 LOOP, FOR로 볼 수 있다.
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 다음에는 cursor나 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문이 오는 예제
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;
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;
제어문
IF문, CASE문 등의 제어문을 PL/SQL에서도 사용할 수 있다.
IF
- 문법
IF 조건1 THEN
처리문1
ELSE IF 조건2 THEN
처리문2
...
ELSE
처리문
END IF;
- IF문은 조건값이 참이면 해당 조건의 처리 문장이 실행
- 다른 프로그래밍 IF문과 다른 점
- 조건 다음에 THEN을 붙인다.
- 보통 ELSE IF를 쓰지만, PL/SQL에서는 ELSIF 명령어를 사용한다.
- 마지막에는 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;
CASE문
- 문법
- 오라클 CASE문과 유사
CASE WHEN 조건1 THEN
처리문1
WHEN 조건2 THEN
처리문2
...
ELSE
처리문
END 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;'Study > Oracle' 카테고리의 다른 글
| PL/SQL_6 - 테이블 함수 (0) | 2021.05.18 |
|---|---|
| PL/SQL 기본_5 - 함수 (0) | 2021.05.17 |
| PL/SQL 기본_4 - 프로시저 (0) | 2021.05.10 |
| PL/SQL 기본_3 - 커서 (0) | 2021.05.10 |
| PL/SQL 기본_1 (0) | 2021.05.10 |