조건문 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 |