본문 바로가기

DATABASE/RECORD_COLLECTION

02. 자료형이 같은 여러 데이터를 저장하는 컬렉션

컬렉션은 특정 자료형의 데이터를 여러 개 저장하는 복합 자료형이다. 여러 종류의 데이터를 하나로 묶어 사용하는 레코드를 테이블의 한 행처럼 사용하면, 컬렉션은 열 또는 테이블과 같은 형태로 사용할 수 있다. 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;

/