6. PL/SQL 조합 데이터 유형 작업
A. 조합 데이터 유형
B. PL/SQL 레코드
** 서로 다른 데이터 유형의 값을 저장하려는 경우, 한번에
하나씩만 저장할 때 사용!
(한 레코드가 다른 레코드의 구성요소가 되는 것)
C. PL/SQL 레코드 생성
[ TYPE 선언 ]
[ USER-DEFINED 레코드 선언 ]
USER-DEFINED 레코드 선언
D. PL/SQL 레코드 구조
E. %ROWTYPE 속성
이름 및 데이터 타입을 가져온다.
참조할 때는 ‘점 표기법’ 사용
F. PL/SQL 레코드 생성 예제
DECLARE
TYPE t_rec IS RECORD
(v_sal number(8),
v_minsal number(8) default 1000,
v_hire_date employees.hire_date%type,
v_recl employees%rowtype);
v_myrec t_rec;
BEGIN
v_myrec.v_sal := v_myrec.v_minsal + 500;
v_myrec.v_hire_date := sysdate;
SELECT * INTO v_myrec.v_recl
FROM employees WHERE employee_id = 100;
DBMS_OUTPUT.PUT_LINE(v_myrec.v_recl.last_name ||’ ‘||
to_char(v_myrec.v_hire_date) ||’ ‘|| to_char(v_myrec.v_sal));
END;
G. %ROWTYPE 속성의 장점
런타임에 변경될 수 있음
-> 유지 관리가 단순화 됨. 기본 테이블이 변경되는 경우,
이 속성을 사용하여 선언된 변수의 데이터 타입도 동적으로
변경됨.
=> 프로그램 재컴파일되면 자동으로 새로운 테이블 형식 반영
행 검색에 유용
ex)
1)
CREATE TABLE retired_emps
(EMPNO NUMBER(4), ENAME VARCHAR2(10),
JOB VARCHAR2(9), MGR NUMBER(4),
HIREDATE DATE, LEAVEDATE DATE,
SAL NUMBER(7,2), COMM NUMBER(7,2),
DEPTNO NUMBER(2));
DECLARE
v_employee_number number := 124;
v_emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO v_emp_rec FROM employees
WHERE employee_id = v_employee_number;
INSERT INTO retired_emps
VALUES(v_emp_rec.employee_id, v_emp_rec.last_name,
v_emp_rec.job_id, v_emp_rec.manager_id,
v_emp_rec.hire_date, sysdate,
v_emp_rec.salary, v_emp_rec.commission_pct,
v_emp_rec.department_id);
END;
/
SELECT * FROM retired_emps;
2) INSERT
DECLARE
v_employee_number number := 124;
v_emp_rec retired_emps%ROWTYPE;
BEGIN
SELECT employee_id, last_name, job_id, manager_id,
hire_date, hire_date, salary, commission_pct,
department_id
INTO v_emp_rec FROM employees
WHERE employee_id = v_employee_number;
INSERT INTO retired_emps VALUES v_emp_rec;
END;
/
SELECT * FROM retired_emps;
3) update
SET VERIFY OFF
DECLARE
v_employee_number number := 124;
v_emp_rec retired_emps%ROWTYPE;
BEGIN
SELECT * INTO v_emp_rec FROM retired_emps;
v_emp_rec.leavedate :=CURRENT_DATE;
UPDATE retired_emps SET ROW = v_emp_rec
WHERE empno = v_employee_number;
END;
/
SELECT * FROM retired_emps;
H. PL/SQL 컬렉션
I. 연관 배열(INDEX BY TABLE)
-> 이 값을 인덱스로 사용하여 데이터 저장
***키 값은 순차적이지 않을 수도 있음
-> 값을 보유
=> 초기화 불가
=> 새 행이 추가됨에 따라 행 수가 동적으로 늘어날 수 있음
J. 연관 배열의 구조
[ UNIQUE KEY 열의 데이터 타입 ]
number 보다 적은 저장영역 필요, 산술연산은
number 보다 빠름
[ VALUE 열의 데이터 타입 ]
K. 연관배열 생성 단계
L. 연관배열 생성 및 액세스
M. INDEX BY TABLE 메소드
O. INDEX BY RECORD TABLE 옵션
저장할 수 있음
레코드 선언
ex)
1)
DECLARE
TYPE dept_table_type IS TABLE OF
departments%ROWTYPE
INDEX BY PLS_INTEGER;
dept_table dept_table_type;
BEGIN
SELECT * INTO dept_table(1) FROM departments
WHERE department_id = 10;
DBMS_OUTPUT.PUT_LINE(dept_table(1).department_id ||’ ‘||
dept_table(1).department_name ||’ ‘||
dept_table(1).manager_id);
END;
/
2)
DECLARE
TYPE emp_table_type IS TABLE OF
employees%ROWTYPE INDEX BY PLS_INTEGER;
my_emp_table emp_table_type;
max_count NUMBER(3) := 104;
BEGIN
FOR I IN 100..max_count
LOOP
SELECT * INTO my_emp_table(i) FROM employees
WHERE employee_id = I;
END LOOP;
FOR I IN my_emp_table.FIRST..my_emp_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
END LOOP;
END;
/
P. 중첩테이블
중첩 테이블 구현에서 차이가 있음
— 항상 순서 없이 저장됨
하지만! 최대 2GB
첫번째 열을 키로 참조하지만, 중첩 테이블에는 키 없음
-> 숫자열이 있음
Q. VARRAY
‘연관 배열’과 비슷
-> 선언 시 상한값 지정해야 함!
— VARRAY의 크기가 4KB보다 작으면 VARRAY의 요소는
테이블 데이터와 함께 인라인으로 저장된다. (중첩 테이블은
순서 상관없이 항상 저장)