[이론] PL/SQL - Collection, 컬렉션이란?

조민수·2025년 3월 30일
0

Computer Science

목록 보기
19/19

COLLECTION

  • Oracle DB에서 제공하는 자료구조 중 하나
  • 레코드와 유사한 데이터 타입이나, 한층 향상되고 확장된 형태
  • 동일 타입의 여러 데이터를 단일 변수에 저장
    • 배열과 같다고 생각하면 편하다.
  • class와 유사하게 생성자를 통해 초기화화며,
    컬렉션 메서드를 제공해 값의 수정, 삭제를 지원한다.

Record?

  • 서로 다른 타입의 데이터 모음

Type

  • COLLECTION의 주요 유형으로는 3가지가 있다.
  1. Associative Array : 연관 배열
  2. Nested Table : 중첩 테이블
  3. VARRAY : 제한 크기 배열

1. ASSOCIATIVE ARRAY

  • key : value로 구성
  • keyindex라고 부르기 때문에 index-by-table이라고도 한다.
    • keyunique
  • 연관 배열은 크기에 대한 제한이 없으며, 내부적으로 인덱스 값으로 정렬된다.
  • 크기가 동적으로 변경되고 정렬되지 않은 데이터 저장 시, 주로 사용된다.

선언

TYPE 연관배열명 IS TABLE OF 연관배열값타입 INDEX BY 인덱스타입; 

예시

DECLARE
	TYPE emp_type IS TABLE OF VARCHAR2(50) INDEX BY NUMBER;
    employees emp_type;
BEGIN
	employees(1) := '조민수';
    employees(2) := '이서진'; -- 값 추가
    
    employees(2) := '꼬미';	-- 값 수정
    employees.DELETE(3);	-- 값 삭제
END;

2. Nested Table

  • 테이블 내부에 또 다른 테이블을 중첩해 데이터 저장
  • 크기가 동적으로 변경되며, 필요에 따라 요소 추가, 제거 가능
  • 데이터가 정렬되지 않는다.
  • 숫자형 인덱스만 사용 가능하고, 생성자를 통해 일반 테이블의 컬럼 타입으로 사용될 수 있다.
  • 사용하기 전 반드시 초기화

선언

TYPE 중첩테이블명 IS TABLE OF 값타입;

예시

CREATE TYPE phone_number AS TABLE OF varchar2(20);

CREATE TABLE emp(
	id NUMBER,
    phones phone_number
) NESTED TABLE phones STORE as phone_table;

3. VARRAY

  • 크기에 제한이 있는 가변 길이 배열.
    • 동적으로 크기를 늘릴 순 있으나, 정해진 최대 한계가 있다.
  • 선언 시 크기(요소의 최대 갯수) 지정
  • 숫자형 인덱스만 가능하다.
  • 사용하기 전 반드시 초기화

선언

TYPE VARRAY명 IS VARRAY(최대크기) OF 요소타입;

예시

CREATE TABLE hobbies_varray AS VARRAY(5) OF VARCHAR2(30);
CREATE TABLE person (
	id NUMBER,
    hobbies hobbies_varray
);

구분Associative ArrayVARRAYNested Table
컬렉션 항목의 개수미지정지정미지정
인덱스 유형문자열 또는 정수정수정수
초기화되지 않은 상태EmptyNULLNULL
ADT(Abstract Data Type) 정의불가능가능가능
유사한 일반 자료 구조해시 테이블, 비순서 테이블배열, 벡터집합, 중복 허용 집합

연산자 정리

  1. := 할당 연산 : 동일 타입 변수 간 복사 가능
  2. 비교연산
    2-1. Associative Array : 불가능
    2-2. Nested Table, VARRAY : 제한된 범위 내에서 가능
    (=, <>, !=, ~=, ^=)
  3. 메소드
  • DELETE : 모든 항목 삭제
    (DELETE(N) : N번째 항목 삭제, DELETE(M, N) : M번째에서 시작해서 N개 삭제)
  • TRIM : Nested Table, VARRAY의 끝 부분 항목 삭제 (TRIM(N) : 마지막 N개 삭제)
  • EXTEND : Nested Table, VARRAY 의 끝 부분에 항목(NULL) 추가
    (EXTEND(N) : N개의 NULL값 추가, EXTEND(N, I) : I번째 항목의 복사본 N개 추가)
  • EXISTS : Nested Table, VARRAY에 지정 항목이 존재하면 TRUE
  • FIRST, LAST, COUNT : 첫 번째 인덱스, 마지막 인덱스, 항목의 수 반환
  • LIMIT : VARRAY가 가질 수 있는 항목의 최대 값 반환
  • PRIOR : 지정된 인덱스의 바로 앞 인덱스 반환 (FIRSTNULL)
  • NEXT : 지정된 인덱스의 바로 뒤 인덱스 반환(LASTNULL)

언제 사용하는지

  1. PL/SQL에서 일괄적은 데이터 처리 및 반복 연산이 필요할 때
  2. 프로지서, 함수에서 복수의 값을 전달/반환할 때
  3. 테이블의 하나의 컬럼에 중첩된 데이터를 표현하고자 할 때
    • 복잡한 데이터 구조 표현에 유용

왜 사용하는지

  • 여러 데이터를 효율적으로 그룹화하고 처리하고자 할 때
  • 반복문(FOR LOOP)를 통해 데이터를 간편하게 접근하고자 할 때
  • DB와 PL/SQL 간 효과적인 데이터 이동이 필요할 때

성능 향상 방안

  1. BULK COLLECT : TABLE → COLLECTION
  • 여러 데이터를 한 번의 작업으로 대량으로 가져오는데 사용
SELECT id, name BULK COLLECT INTO ids, names FROM hr;
  1. FORALL : COLLECTION → TABLE
  • 다수의 데이터를 한 번의 작업으로 DB에 업데이트/삽입해 성능 향상
FORALL I IN hr_ids.FIRST .. hr_ids.LAST
	UPDATE hr SET salary = salary * 1.1 WHERE id = hr_ids(I);

PL/SQL 에서 BULK COLLECT, FORALL(배열 형태로 묶어서 처리)를 사용할 땐, PGA라는 별도의 메모리 영역 사용.

  • 배열 크기가 너무 클 경우, PGA 영역을 과도하게 사용해 메모리 부족 현상을 일으킬 수 있음
    LIMIT을 통해 적당한 배치 단위로 나누어 사용하는 것이 가장 현명함
  1. 데이터 특성에 따른 적절한 COLLECTION 타입 선택
    3-1) Associative Array : 인덱스 접근이 매우 빠름, 임이의 키 값 접근이 잦을 때 유용
    3-2) Nested Table : 데이터 삽입/삭제가 빈번할 때, DB 테이블과의 연동에 적합
    3-3) VARRAY : 길이 고정, 데이터 순서 유지가 중요할 때

[참고자료]

profile
멈춤에 두려움을 느끼는 것

0개의 댓글

관련 채용 정보