컬렉션(COLLECTION)
레코드와 유사한 데이터 타입인데, 레코드보다는 한층 더 향상되고 확장된 형태이다.
사용법이 객체지향 프로그램의 클래스와 유사하다.
생성자를 통해 초기화할 수 있고, 빌트인 함수와 프로시저로 구성된 컬렉션 메서드를 제공하며, 이러한 메서드를 통해 컬렉션에 접근해 값을 수정, 삭제할 수 있다.
종류
- 연관 배열
- VARRAY
- 중첩 테이블
연관 배열(ASSOCIATIVE ARRAY)
키와 값으로 구성된 컬렉션으로, 키를 인덱스라고도 부르기 때문에 연관 배열을 INDEX-BY 테이블이라고도 한다.
연관배열의 키는 유일한 키다.
배열을 구성하는 각 항목을 요소라고 하며, 요소의 값은 연관배열변수명(인덱스) 형태로 접근할 수 있다.
연관배열은 그 크기에 제한 없이 입력해서 사용할 수 있으며, 각 요소에 값을 입력할 때마다 내부적으로는 숫자형이든 문자형이든 인덱스 값으로 정렬된다.
1 | TYPE 연관배열명 IS TABLE OF 연관배열값타입 INDEX BY 인덱스타입; | cs |
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DECLARE -- 숫자-문자 쌍의 연관 배열 선언 TYPE AV_TYPE IS TABLE OF VARCHAR2(40) INDEX BY PLS_INTEGER; -- 연관 배열 변수 선언 VAV_TEST AV_TYPE; BEGIN -- 연관 배열에 값 할당 VAV_TEST(10) := '10에 대한 값'; VAV_TEST(20) := '20에 대한 값'; DBMS_OUTPUT.PUT_LINE(VAV_TEST(10)); DBMS_OUTPUT.PUT_LINE(VAV_TEST(20)); END; | cs |
VARRAY(VARIABLE-SIZE ARRAY)
VARRAY는 가변 길이 배열로서 연관 배열과는 달리 그 크기에 제한이 있다.
선언할 때 크기(요소 갯수)를 지정하면 이보다 큰 수로 요소를 만들 수 없다.
연관배열과 동일한 방식으로 요소값에 접근하는데, 숫자형 인덱스만 가능하다.
1 | TYPE VARRAY명 IS VARRAY(최대크기) OF 요소값타입; | cs |
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | DECLARE -- 5개의 문자형으로 이루어진 VARRAY 선언 TYPE VA_TYPE IS VARRAY(5) OF VARCHAR2(20); -- VARRAY 변수 선언 VVA_TEST VA_TYPE; VN_CNT NUMBER := 0; BEGIN -- 생성자를 사용해 값 할당(최초 3개만 할당) VVA_TEST := VA_TYPE('FIRST', 'SECOND', 'THIRD', '', ''); LOOP VN_CNT := VN_CNT + 1; IF VN_CNT > 5 THEN EXIT; END IF; DBMS_OUTPUT.PUT_LINE(VVA_TEST(VN_CNT)); END LOOP; VVA_TEST(2) := 'TEST'; VVA_TEST(4) := 'FOURTH'; VN_CNT := 0; LOOP VN_CNT := VN_CNT + 1; IF VN_CNT > 5 THEN EXIT; END IF; DBMS_OUTPUT.PUT_LINE(VVA_TEST(VN_CNT)); END LOOP; END; | cs |
중첩테이블(NESTED TABLE)
중첩 테이블은 실제 테이블이 아니고 컬렉션 타입의 한 종류이다.
크기에 제한은 없지만, 숫자형 인덱스만 사용할 수 있고, 생성자를 이용하여 일반 테이블의 컬럼 타입으로 사용될수 있다.
1 | TYPE 중첩테이블명 IS TABLE OF 값타입; | cs |
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DECLARE -- 중첩테이블 선언 TYPE NT_TYPE IS TABLE OF VARCHAR2(10); -- 변수 선언 VNT_TEST NT_TYPE; BEGIN -- 생성자를 사용해 값 할당 VNT_TEST := NT_TYPE('FIRST', 'SECOND', 'THIRD'); -- 값 출력 DBMS_OUTPUT.PUT_LINE(VNT_TEST(1)); DBMS_OUTPUT.PUT_LINE(VNT_TEST(2)); DBMS_OUTPUT.PUT_LINE(VNT_TEST(3)); END; | cs |
반응형
'📃 DATABASE > ORACLE' 카테고리의 다른 글
[PL/SQL] 사용자 정의 타입 (2) | 2018.02.12 |
---|---|
[PL/SQL] 컬렉션 메서드 (0) | 2018.02.12 |
[PL/SQL] 레코드(RECORD) : 커서형 레코드, 중첩 레코드 (0) | 2018.02.10 |
[PL/SQL] 레코드(RECORD) : 사용자정의형 레코드, 테이블형 레코드 (0) | 2018.02.08 |
[PL/SQL] 커서(CURSOR) (3) : 커서 변수 (0) | 2018.02.01 |