[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 - 커서
'4. Database > 4_3 Oracle 기본' 카테고리의 다른 글
[Oracle] 시스템 테이블 정리 (0) | 2018.06.14 |
---|---|
[Oracle] PL/SQL 기초3 - 커서 (6) | 2018.06.14 |
[Oracle] PL/SQL 기초2 - 반복문, 제어문 (3) | 2018.06.03 |
[Oracle] PL/SQL 기초 (정의, 특징, 사용방법, 변수선언 방법) (3) | 2018.05.24 |
[Oracle] Dual 테이블이란? (3) | 2018.05.10 |
오라클 비밀번호 만료기간 해제 (1) | 2017.12.03 |
안녕하세요. 작성해주신 프로시저 관련 자료 잘 보고 있습니다. 변수마다 v_ 가 붙어 있는데 이건 따로 변수 명명 규칙이 있는건가요? 아니면 대희님의 개인적인 코딩 습관이신건가요? 변수를 선언할 때 지켜야할 규칙 같은게 있나 궁금합니다.
답글
아.. 저와 같은 경우는 변수는 V_, 파라미터는 P_ 와같이 작성하여 구분하고 있었을 것 같아요.
규칙은 아니지만, 저런식으로 구분하여 작성하면 아마 추후 해당 프로시저를 잘 모르는 다른 사람들이 추후 유지보수, 수정 할때
얼추 의미나 뜻을 이해 하기 조금더 쉬우라고 암묵적으로 사용하고 있었습니다.
업무시 다른분들도 이런식으로 많이 사용하고 있다보니, 그냥 이렇게 사용하긴 했지만, 조금이나마 다른 사람들과 협업시 도움이 되지 않을까 ... 하네요 ㅋㅋㅋ
친절한 답글 감사합니다. 게시글 잘 챙겨보고 있습니다.