본문 바로가기

Database

13. PL/SQL - 제어문

조건문 IF, CASE

 

1. IF

-- 형식1: 조건이 하나
IF(조건) THEN 
   실행문장; 
END IF; 

-- 형식2: 조건이 여러개
IF(조건) THEN
  실행문장;
ELSIF(조건) THEN
  실행문장;
ELSIF(조건) THEN
  실행문장;
ENDIF;

 

예제: emp_table에서 empno, ename, deptno, dname을 출력하라. 단, dname의 값은 다음과 같다.

deptno = 10 : ACCOUNT / deptno = 20 : RESERCH / deptno = 30 : SALES / detpno = 40 : OPERATIONS

DECLARE
 vempno emp_table.empno%type;
 vename emp_table.ename%type;
 vdeptno emp_table.deptno%type;
 vdname VARCHAR2(20) := null;

BEGIN
 SELECT empno, ename, deptno INTO vempno, vename, vdeptno FROM emp_table WHERE empno = 7900;

IF​ (vdeptno = 10) 
THEN vdname := 'ACCOUNT';
END IF;

IF (vdeptno = 20) 
THEN vdname := 'RESERCH';
END IF;

IF (vdeptno = 30) 
THEN vdname := 'SALES';
END IF;

IF (vdeptno = 40) 
THEN vdname := 'OPERATIONS';
END IF;

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

 

예제2: 조건이 여러개 

DECLARE
 vempno emp_table.empno%type;
 vename emp_table.ename%type;
 vdeptno emp_table.deptno%type;
 vdname VARCHAR2(20) ​​:= null;

BEGIN
 SELECT empno, ename, deptno INTO vempno, vename, vdeptno FROM emp_table WHERE empno = 7900;

IF(vdeptno = 10) 
THEN vdname := 'ACCOUNT';
ELSIF(vdeptno = 20)
THEN vdname := 'RESERCH';
ELSIF(vdeptno = 30)
THEN vdname := 'SALES';
ELSIF(vdeptno = 40)
THEN vdname := 'OPERATIONS';
END IF;

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

 

예제3: emp_table에서 사원번호가 7900인 사원의 empno, ename, comm을 출력하되,

           해당 사원의 COMM이 0보다 크면 COMM의 금액을, 0보다 작으면 '사원의 커미션은 없습니다.'라고 출력하기

DECLARE
 vempno emp_table.empno%type;
 vename emp_table.ename%type;
 vcomm emp_table.comm%type := null;

BEGIN
 SELECT empno, ename, comm INTO vempno, vename, vcomm FROM emp_table WHERE empno = 7900;

IF(vcomm > 0) 
THEN DBMS_OUTPUT.PUT_LINE(vename||'의 커미션은 ' || vcomm || '입니다.');
ELSIF(vcomm < 0)
THEN DBMS_OUTPUT.PUT_LINE(vename||'의 커미션은' || ' 없습니다.');
END IF;

END;

 

 

2. CASE

-- 형식
CASE[조건]
 WHEN  조건1  THEN  결과1
 WHEN  조건x  THEN  결과x
-- ....
[ELSE 기본값]
END;

예제: emp_table에서 empno, ename, deptno, dname을 출력하라. 단, dname의 값은 다음과 같다.

deptno = 10 : ACCOUNT / deptno = 20 : RESERCH / deptno = 30 : SALES / detpno = 40 : OPERATIONS

DECLARE
 v_empno emp_table.empno%type;
 v_ename emp_table.ename%type;
 v_deptno emp_table.deptno%type;
 v_dname VARCHAR2(20);

BEGIN
 SELECT empno, ename, deptno INTO v_empno, v_ename, v_deptno FROM emp_table WHERE empno = &empno;

v_dname := CASE v_deptno 
 WHEN 10 THEN 'ACCOUNT'
 WHEN 20 THEN 'RESERCH'
 WHEN 30 THEN 'SALES'
 WHEN 40 THEN 'OPPERATIONS'
END;

DBMS_OUTPUT.PUT_LINE(v_empno||'. '||v_ename||'의 부서이름은'||v_dname||'입니다.');

END;

▶ 사용자로부터 입력 받는법(형식)

   - &컬럼명: 컬럼의 자료형이 숫자

   - '&'컬럼명: 컬럼 자료형이 문자

 


조건문- 반복문

- 반복 횟수 모름: BASIC LOOP, WHILE

- 반복 횟수 지정: FOR

 

1. Basic Loop

-- 형식
LOOP 
  PL/SQL문장;
  PL/SQL문장;
  EXIT[WHEN 조건];
END LOOP;

-- 예제1: 0~5 숫자 출력
DECLARE
 num NUMBER := 0;

BEGIN 
LOOP 
 DBMS_OUTPUT.PUT_LINE(num);
 num := num + 1;
 EXIT WHEN num > 5;
 END LOOP;
END;

 

2. WHILE

-- 형식
WHILE  조건  LOOP
 PL/SQL문장
 PL/SQL문장
END LOOP;

* BASIC LOOP문은 나중에 조건을 검색하지만 WHILE문은 시작부터 조건을 검사한 후 PL/SQL문장 수행

  즉, BASIC LOOP문은 조건이 틀려도 PL/SQL문장이 1회는 실행되나 WHILE은 실행되지 않음

-- 예제: 5 ~ 0 숫자 출력하기 
DECLARE
  num NUMBER := 5;
BEGIN
 WHILE num >= 0 LOOP      --->  num은 5,  num이 0일 때까지 반복(-1)
 DBMS_OUTPUT.PUT_LINE(num);
 num := num - 1;
 END LOOP;
END;

 

 

3. FOR

-- 형식
FOR  반복할 변수  IN [REVERSE:역순]  시작..끝 LOOP
  실행문장;
  실행문장;
 
 -- ...

END LOOP;


-- 예제: 0~5숫자 출력 
BEGIN  
 FOR i IN 0..5 LOOP   ---> 여기서 출력할 변수 i는 지역변수로 DECLARE에서 지정하지 않음
 DBMS_OUTPUT.PUT_LINE(i);
 END LOOP;
END;

 


 

%TYPE / %ROWTYPE

 

1. %TYPE

- 해당 변수명은 지정한 테이블 컬럼의 데이터타입, 크기를 따라감(이미 선언된 다른 변수나 컬럼의 데이터 타입 이용하여 선언)

- 기술한 컬럼의 데이터 타입을 모를 경우 사용할 수 있고, 코딩 이후 컬럼 데이터타입이 변경되어도 수정 필요X

2. %ROWTYPE:

- 하나 이상의 데이터 값을 갖는 데이터 타입으로 배열과 비슷한 역할을 하며 재사용 가능

- 테이블, 뷰 내부 컬럼 데이터형, 크기, 속성 등을 그대로 사용 가능

- 지정된 테이블의 구조와 동일한 구조 갖는 변수 선언 가능

- 컬럼들의 수나 데이터 타입을 모를 때 쓸 수 있어 편리

- 데이블의 데이터 컬럼의 데이터타입이 변경될 경우 프로그램 재수정 필요 없음

▶ 차이점

%TYPE은 특정 한 컬럼의 한 개의 데이터만 저장하고

%ROWTYPE은 테이블의 행 단위이기 때문에 모든 컬럼에 대한 값을 저장할 수 있으나 한 번에 한 개의 데이터만 저장

'Database' 카테고리의 다른 글

15. PL/SQL - 함수/프로시저/트리거  (0) 2023.05.04
14. PL/SQL - 커서  (0) 2023.05.04
12. PL/SQL - SQL*Plus  (0) 2023.05.04
11. 그룹함수: ROLLUP/CUBE/GROUPING SET  (0) 2023.05.04
10. 시퀀스/뷰  (0) 2023.05.04