컬렉션은 특정 자료형의 데이터를 여러 개 저장하는 복합 자료형이다. 여러 종류의 데이터를 하나로 묶어 사용하는 레코드를 테이블의 한 행처럼 사용하면, 컬렉션은 열 또는 테이블과 같은 형태로 사용할 수 있다. PL/SQL에서 사용할 수 있는 컬렉션은 세 가지 종류가 있다.
1) 연관배열
2) 중첩 테이블
3) VARRAY
연관배열
연관배열은 인덱스라고도 불리는 키, 값으로 구성되는 컬렉션이다. 중복되지 않은 유일한 키를 통해 값을 저장하고 불러오는 방식을 사용한다. 연관 배열을 정의할 때 자료형이 TABLE인 변수를 다음과 같이 작성한다.
TYPE 연관배열이름 IS TABLE OF 자료형( NOT NULL )
INDEX BY 인덱스형;
DECLARE
TYPE ITAB_EX IS TABLE OF VARCHAR2(20)
INDEX BY PLS_INTEGER;
text_arr ITAB_EX;
BEGIN
text_arr(1) := '1st data';
text_arr(2) := '2nd data';
text_arr(3) := '3rd data';
text_arr(4) := '4th data';
DBMS_OUTPUT.PUT_LINE ( ' text_arr(1) : ' || text_arr(1) );
DBMS_OUTPUT.PUT_LINE ( ' text_arr(2) : ' || text_arr(2) );
DBMS_OUTPUT.PUT_LINE ( ' text_arr(3) : ' || text_arr(3) );
DBMS_OUTPUT.PUT_LINE ( ' text_arr(4) : ' || text_arr(4) );
END;
/
레코드를 활용한 연관 배열 : 연관 배열의 자료형에는 레코드를 사용할 수 있다. 이 경우 다양한 자료형을 포함한 레코드를 여러 개 사용할 수 있으므로 마치 테이블과 같은 데이터 사용과 저장이 가능하다.
DECLARE
TYPE REC_DEPT IS RECORD (
deptno DEPT.DEPTNO%TYPE,
dname DEPT.DNAME%TYPE );
TYPE ITAB_DEPT IS TABLE OF REC_DEPT
INDEX BY PLS_INTEGER;
dept_arr ITAB_DEPT;
idx PLS_INTEGER := 0;
BEGIN
FOR i IN ( SELECT DEPTNO, DNAME FROM DEPT) LOOP
idx := idx+1;
dept_arr(idx).deptno := i.deptno;
dept_arr(idx).dname := i.dname;
DBMS_OUTPUT.PUT_LINE ( dept_arr(idx).deptno || ' : ' || dept_arr(idx).dname);
END LOOP;
END;
/
특정 테이블의 전체 열과 같은 구성을 가진 연관 배열을 제작한다면 %ROWTYPE을 사용하는 것이 레코드를 정의하는 것 보다 간편하다.
DECLARE
TYPE ITAB_DEPT IS TABLE OF DEPT%ROWTYPE
INDEX BY PLS_INTEGER;
dept_arr ITAB_DEPT;
idx PLS_INTEGER := 0;\
BEGIN
FOR i IN (SELECT * FROM DEPT) LOOP
idx := idx+1;
dept_arr(idx).deptno := i.deptno;
dept_arr(idx).dname := i.dname;
dept_arr(idx).loc := i.loc;
DBMS_OUTPUT.PUT_LINE (
dept_arr(idx).deptno || ' : ' || dept_arr(idx).dname || ' : ' || dept_arr(idx).loc ) ;
END LOOP;
END;
/
컬렉션 메서드
오라클에서는 컬렉션 사용상의 편의를 위해 몇 가지 서브프로그램을 제공하고 있다. 이를 컬렉션 메서드라고 한다. 컬렉션 메서드는 컬렉션과 관련된 다양한 정보 조회 기능을 제공한다. 컬렉션 내의 데이터 삭제나 컬렉션 크기 조절을 위한 특정 조작도 가능하다.
- EXIST(n) : 컬렉션에서 n인덱스의 데이터 존재 여부를 true/false로 반환
- COUNT : 컬렉션에 포함되어 있는 요소 개수 반환
- LIMIT : 현재 컬렉션의 최대 크기 반환. 최대 크기가 없으면 NULL 반환
- FIRST : 컬렉션의 첫 번째 인덱스 번호를 반환
- LAST : 컬렉션의 마지막 인덱스 번호 반환
- PRIOR(n) : 컬렉션에서 n인덱스 바로 앞 인덱스 값을 반환. 대상 인덱스 값이 존재하지 않으면 NULL 반환
- NEXT(n) : 컬렉션에서 n인덱스 바로 다음 인덱스 값을 반환. 대상 인덱스 값이 존재하지 않으면 NULL 반환
- DELETE : 컬렉션에 저장된 요소를 지우는데 사용.
1) 단일 사용시 컬렉션에 저장된 모든 요소 삭제
2) DELETE(n) : n인덱스의 컬렉션 요소 삭제
3) DELETE(n,m) : n인덱스부터 m인덱스까지 요소 삭제
- EXTEND : 컬렉션 크기 증가. 중첩테이블과 VARRAY에서만 사용
- TRIM : 컬렉션 크기 감소. 중첩테이블과 VARRAY에서만 사용
컬렉션 메서드는 컬렉션형으로 선언한 변수에 마침표와 함께 작성해서 사용할 수 있다.
DECLARE
TYPE ITAB_EX IS TABLE OF VARCHAR2(20)
INDEX BY PLS_INTEGER;
text_arr ITAB_EX;
BEGIN
text_arr(1) := '1st data';
text_arr(2) := '2nd data';
text_arr(3) := '3rd data';
text_arr(50) := '50th data';
DBMS_OUTPUT.PUT_LINE( ' text_arr.COUNT : ' || text_arr.COUNT);
DBMS_OUTPUT.PUT_LINE( ' text_arr.FIRST : ' || text_arr.FIRST);
DBMS_OUTPUT.PUT_LINE( ' text_arr.LAST : ' || text_arr.LAST);
DBMS_OUTPUT.PUT_LINE( ' text_arr.PRIOR(50) : ' || text_arr.PRIOR(50) );
DBMS_OUTPUT.PUT_LINE( ' text_arr.NEXT(50) : ' || text_arr.NEXT(50) );
END;
/
'DATABASE > RECORD_COLLECTION' 카테고리의 다른 글
01. 자료형이 다른 여러 데이터를 저장하는 레코드 (0) | 2024.04.08 |
---|