오라클/PL/SQL

PL/SQL 제어문

김포춘 2014. 10. 13. 18:30
반응형

1. 조건문 (IF 문)

유형 1. IF ~ END IF 문장

조건이 여러 개 일 경우에 사용하는 가장 기본적인 IF 문장

문법 : 

IF (조건) THEN

실행문장 ;

END IF ;

예 : EMP 테이블에서 EMPNO, ENAME, DEPTNO, DNAME 을 출력

단 DNAME 의 값은 아래와 같다

DEPTNO 가 10 이면 'ACCOUNT' ,

DEPTNO 가 20 이면 'RESEARCH' ,

DEPTNO 가 30 이면 'SALES' ,

DEPTNO 가 40 이면 'OPERATIONS' 로 출력


SCOTT>DECLARE

vempno emp.empno%TYPE ;

vname emp.ename%TYPE ;

vdeptno emp.deptno%TYPE ;

vdname VARCHAR2(20) := null ;

BEGIN

SELECT empno, ename, deptno

INTO vempno, vename, vdeptno

FROM emp

WHERE empno=7900 ;

IF (vdeptno = 10) THEN  --IF 문 시작

vdname :='ACCOUNT' ;

END IF ; --IF 문 끝

IF (vdeptno = 10) THEN

vdname :='RESEARCH' ;

END IF ;

IF (vdeptno = 10) THEN

vdname :='SALES' ; 

END IF ;

IF (vdeptno = 10) THEN

vdname :='OPERATIONS' ;

END IF ;

DBMS_OUTPUT.PUT_LINE (vempno||'  '||vename||'  '||vdeptno||'  'vdname) ;

END ;

/


위처럼 조건이 여러 개 일 경우 매번 조건을 새로 시작해야 하기에 사용함에 있어 불편함이 많다.

그래서 조건이 2개 이상일 경우 다음의 유형 2의 방법을 더 많이 사용


유형 2.IF ~THEN ~ELSIF ~END IF 문장

문법 :

IF (조건) THEN

실행문장 ;

   ELSIF (조건) THEN

실행문장 ;

   ELSIF (조건) THEN

실행문장 ;

END IF ;

예 : MP 테이블에서 EMPNO, ENAME, DEPTNO, DNAME 을 출력

단 DNAME 의 값은 아래와 같다

DEPTNO 가 10 이면 'ACCOUNT' ,

DEPTNO 가 20 이면 'RESEARCH' ,

DEPTNO 가 30 이면 'SALES' ,

DEPTNO 가 40 이면 'OPERATIONS' 로 출력


SCOTT>DECLARE

vempno emp.empno%TYPE ;

vname emp.ename%TYPE ;

vdeptno emp.deptno%TYPE ;

vdname VARCHAR2(20) := null ;

BEGIN

SELECT empno, ename, deptno

INTO vempno, vename, vdeptno

FROM emp

WHERE empno=7900 ;

IF (vdeptno = 10) THEN

vdname :='ACCOUNT' ;

ELSIF (vdeptno = 20) THEN

vdname :='RESEARCH' ;

ELSIF (vdeptno = 30) THEN

vdname :='SALES' ;

ELSIF (vdeptno = 40) THEN

vdname :='OPERATIONS' ;

END IF ;
DBMS_OUTPUT.PUT_LINE (vempno||'  '||vename||'  '||vdeptno||'  '||vdname) ;
END ;
/
유형 3.IF~THEN~ELSE~END IF (조건이 2개 일 경우 사용)
비교조건이 2개 일 경우 사용되는 IF 문장
문법 :
IF (조건) THEN
실행 문장 ;
ELSE
실행 문장 ;
END IF ;

예 : EMP 테이블에서 사원번호가 7900 번인 사원의 EMPNO, ENAME, COMM 을 출력하되 해당 사원의 COMM 이 0보다 크면 COMM 의 금액을 출력하고, 0 보다 작으면 '사원의 보너스는 없습니다' 라는 문장을 출력

SCOTT>DECLARE
vempno    emp.empno%TYPE ;
vename    emp.ename%TYPE ;
vcomm    emp.comm%TYPE :=NULL ;
BEGIN
SELECT empno, ename, comm INTO vempno, vename, vcomm
FROM emp
WHERE empno = 7900 ;
IF vcomm >0 THEN
DBMS_OUTPUT.PUT_LINE (vename||' 사원의 보너스는 '||vcomm||'입니다') ;
ELSE    
DBMS_OUTPUT.PUT_LINE (vename||' 사원의 보너스는 없습니다') ;
END IF ;
END ;
/

2. CASE 문

IF 문장과 같이 비교 조건이 여러 가지 일 경우 훨씬 더 간결하고 간단하게 조건을 파악해서 분기시킬 수 있는 제어문

문법 :

CASE [조건]

WHEN 조건 1 THEN 결과 1

WHEN 조건 2 THEN 결과 2

...

WHEN 조건 n THEN 결과 n

[ELSE 기본값]

END ;


CASE 내부의 여러 조건들을 구분할 때 ,(콤마) 를 사용하지 않음


사용 예 1 : 사용자로부터 사원 번호를 입력 받은 후 EMP 테이블에서 EMPNO, ENAME, DEPTNO, DNAME 을 출력하되

     DEPTNO 가 10 이면 'ACCOUNT' ,

     DEPTNO 가 20 이면 'RESEARCH' ,

     DEPTNO 가 30 이면 'SALES' ,

     DEPTNO 가 40 이면 'OPERATIONS' 로 출력


SCOTT>DECLARE

2    v_empno    emp.empno%TYPE ;

3    v_ename    emp.ename%TYPE ;

4    v_deptno    emp.deptno%TYPE ;

5    v_dname    varchar2(10) ;

6    BEGIN

7    SELECT empno, ename, deptno

8    INTO    v_empno, v_ename, v_deptno

9    FROM emp

10   WHERE empno = &empno ;

11   v_dname := CASE v_deptno

12                     WHEN 10 THEN 'ACCOUNT'

13                     WHEN 20 THEN 'RESEARCH'

14                     WHEN 30 THEN 'SALES'

15                     WHEN 40 THEN 'OPERATIONS'

16                    END ;

17    DBMS_OUTPUT.PUT_LINE (v_empno||'  '||v_deptno||'  'v_dname) ;

18    END ;

19    /

Enter value for empno : 7900

7900    JAMES    30    SALES


위 예에서 11~ 16줄의 CASE 부분을 아래와 같이 변형해도 결과는 동이랗게 나옴

11    v_dname := CASE

12                        WHEN v_deptno = 10 THEN 'ACCOUNT'

13                        WHEN v_deptno = 20 THEN 'RESEARCH'

14                        WHEN v_deptno = 30 THEN 'SALES'

15                        WHEN v_deptno = 40 THEN 'OPERATIONS'

16                       END ;









3. 반복문


반응형

'오라클 > PL/SQL' 카테고리의 다른 글

PL/SQL sub program  (0) 2014.10.16
PL/SQL 예외처리  (0) 2014.10.16
PL/SQL CURSOR  (0) 2014.10.14
PL/SQL 변수  (0) 2014.10.13
PL/SQL 시작하기  (0) 2014.10.13