C#,Delphi,Oracle,MSSQL 개발자블로그
[Oracle/기본]20. 조합 데이터 형과 작업 본문
● 조합 데이터형 (또는 Collection 이라고도 부른다.)
-RECORD
관련은 있으나 비슷하지 않은 데이터를 논리적인 한 단위로 묶기 위해서 RECORD 데이터형을 사용한다.
-TABLE
전체 객체로서 데이터의 모음을 참조하고 조작하기 위해 TABLE 데이터 형을 사용한다.
-중첩 TABLE
-VARRAY
● PL/SQL 레코드
RECORD는 여러개의 데이터 타입을 갖는 변수들의 집합니다.
PL/SQL 테이블과 다르게 개별 필드의 이름을 부여할 수 있고, 선언시 초기화가 가능하다.
TYPE type_name IS RECORD
(field_declaration[, field_declaration]...);
identifier type_name;
type_name RECORD의 형의 이름
field_declaration 레코드 내 필드명, 데이터형, %TYPE, %ROWTYPE속성을 사용할 수 있다.
Ex. TYPE emp_record_type IS RECORD
(ename VARCHAR2(10),
job VARCHAR2(9),
sal NUMBER(7,2));
emp_record emp_record_type;
Ex.
DECLARE
TYPE emp_record_type IS RECORD
(empno NUMBER(4) NOT NULL := 10,
ename emp.ename%TYPE,
job emp.job%TYPE);
emp_record emp_record_type;
☞ 사용시 예
emp_record.job := 'CLERK';
●%ROWTYPE
하나 이상의 데이터값을 갖는 데이터 타입으로 배열과 비슷한 역할을 하고 재사용이 가능하다.
%ROWTYPE 데이터 형과, PL/SQL테이블과 레코드는 복합 데이터 타입에 속한다.
테이블이나 뷰 내부의 컬럼 데이터형, 크기, 속성등을 그대로 사용 할 수 있다.
%ROWTYPE 앞에 오는 것은 데이터베이스 테이블 이름이다.
지정된 테이블의 구조와 동일한 구조를 갖는 변수를 선언 할 수 있다.
데이터베이스 컬럼들의 수나 DATATYPE을 알지 못할 때 편리 하다.
테이블의 데이터 컬럼의 DATATYPE이 변경 될 경우 프로그램을 재수정할 필요가 없다.
DECLARE
identifier reference%ROWTYPE;
identifier 레코드의 이름이다.
reference 레코드의 기초가 되는 테이브, 뷰, 커서, 커서 변수명이다.
레코드를 선언할 때 (즉, 테이블 또는 뷰 가 존재해야 한다.) 이 참조가 유효한지 확실히 해야 한다.
EX. DECLARE
emp_record emp%ROWTYPE;
Ex. DECLARE
item_record item%ROWTYPE;
BEGIN
SELECT *
INTO item_record
FROM item
WHERE ...
item 테이블의 열 값은 item_record로 이름 붙여진 레코드 안으로 지정한다.
- 장점
1. 기본 데이터베이스 열의 데이터형과 숫자는 모르게 할 수 있다.
2. 기본 데이터베이스 열의 데이터형과 숫자는 실행 중에 변경될 수 있다.
3. SELECT 문장으로 행을 검색할 때 유용하다.
● PL/SQL 테이블
1. 두 구성요소로 구성된다. (총 2개의 컬럼)
- BINARY_INTEGER 데이터 형의 기본 키
- 스칼라 또는 레코드 데이터형의 열
2. 제한되어 있지 않으므로 동적으로 증가 한다.
TYPE type_name IS TABLE OF
{column_type / variable%TYPE / table.column%TYPE} [NOT NULL]
[INDEX BY BINARY_INTEGER];
identifier type_name;
Ex. TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
...
Ex. DECLARE TYPE date_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
date_table date_table_type;
Ex. DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
hiredate_table hiredate_table_type;
BEGIN
ename_table(1) := 'CAMERON'; --ename_table 에서 1번째 행을 참조한다.
hiredate_table(8) := SYSDATE + 7; --hiredate_table 에서 8번째 행을 참조한다.
IF ename_table.EXIST(1) THEN --인덱스 1 인행이 적어도 하나 반환되면 TRUE를 반환한다.
INSERT INTO ... 존재하지 않는 테이블 요소를 참조할 때 발생되는 오류를 막기 위해
EXIST문장을 사용한다.
...
END;
Ex. DECLARE
TYPE dept_table_type IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_table_ dept_table_type;
- 데이터베이스 테이블의 모든 필드에 대한 정보를 저장하기 위해 필요한 테이블 정의는 하나이기 때문에 레코드 테이블은
PL/SQL 테이블의 기능성을 크게 증가시킨다.
Ex. 참조 예,
dept_tabe(15).location := 'Atlanta';
location은 필드를 나타낸다.
● %ROWTYPE 속성과 조합 데이터형 RECORD 사이의 차이점은,
RECORD는 레코드에서 필드의 데이터형을 지정하거나 개별 필드를 선언할 수 있도록 해 준다는 것이다.
● PL/SQL 테이블 메소드 사용
PL/SQL 테이블을 쉽게 사용하기 위해 사용한다.
방법 |
설명 |
EXISTS(n) |
n 번째 요소가 PL/SQL 테이블에 존재한다면 TRUE를 리턴한다. |
COUNT |
PL/SQL 테이블이 현재 포함하는 요소의 숫자를 리턴한다. |
FIRST LAST |
PL/SQL 테이블에서 처음과 마지막 (가장 작고 크고) 인덱스 숫자를 리턴한다. |
PRIOR(n) |
PL/SQL 테이블에서 인덱스 n 이전의 인덱스 숫자를 리턴한다. |
NEXT(n) |
PL/SQL 테이블에서 인덱스 n 다음의 인덱스 숫자를 리턴한다. |
EXTEND(n,i) |
PL/SQL 테이블의 크기 증가를 위해 EXTEND 는 PL/SQL 테이블에 대한 1개의 NULL 요소 추가. EXTEND(n)은 PL/SQL 테이블에 n개의 NULL 요소를 추가. EXTEND(n,i)는 PL/SQL 테이블에 대한 i번째 요소에 n 개의 NULL 요소를 추가. |
TRIM |
PL/SQL 테이블의 끝에서 한 요소를 제거. TRIM(n)은 PL/SQL 테이블의 끝에서 n개의 요소를 제거. |
DELETE |
DELETE는 PL/SQL 테이블에서 모든 요소를 제거. DELETE(n)는 PL/SQL 테이블에서 n번째 요소를 제거. DELETE(m,n)는 PL/SQL 테이블에서 m...n 까지의 요소를 제거. |
'Programming > Oracle 공부' 카테고리의 다른 글
[Oracle/기본]22. 고급 명시적 커서 개념 (0) | 2017.05.31 |
---|---|
[Oracle/기본]21. 명시적 커서 작성 (0) | 2017.05.31 |
[Oracle/기본]19. 제어 구조 작성 (0) | 2017.05.31 |
[Oracle/기본]18. 오라클 서버와 대화 (0) | 2017.05.31 |
[Oracle/기본]17. 실행 문장 작성 (0) | 2017.05.31 |