> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/development-guide/collection-type.md).

# 컬렉션 타입의 사용

Tibero의 컬렉션 타입과 사용 방법에 대해서 설명합니다.

## 개요

컬렉션 타입은 같은 타입의 값들을 모아 두기 위해 정의할 수 있는 사용자 정의 타입의 한 종류입니다.

CREATE TYPE 문으로 생성하는 컬렉션 타입은 다음의 두 가지 형태 중 하나로 존재합니다.

* 배열은 순서가 있는 같은 타입의 구성요소들의 모음입니다.
* 네스티드 테이블은 개수의 제한이 없는 순서가 정해지지 않은 같은 타입의 구성요소들의 모음입니다.

{% hint style="info" %}
**참고**

현재 네스티드 테이블은 PSM 내에서만 사용이 가능합니다.
{% endhint %}

컬렉션을 PSM 내에서 선언하고 사용하는 방법과 PSM 내에서만 사용하는 인덱스 테이블, MULTISET 연산자와 집합 조건은 "tbPSM 안내서"의 [컬렉션 타입](/tibero-manuals/7.2.6.manuals/tbpsm-guide/composite-types/collections.md)에서 설명합니다. 컬렉션 변수에 사용하는 COUNT, EXTEND 등의 함수와 프러시저는 같은 안내서의 [컬렉션 함수와 프러시저](/tibero-manuals/7.2.6.manuals/tbpsm-guide/composite-types/collection-methods.md)를 참고합니다. 본 장에서는 CREATE TYPE 문으로 컬렉션 타입을 생성하는 방법과 테이블과 SQL 문장에서 컬렉션을 사용하는 방법을 설명합니다.

### 컬렉션 타입 생성

**CREATE TYPE** 문을 사용해 컬렉션 타입을 생성합니다. 상세 문법은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"의 [CREATE TYPE](/tibero-manuals/7.2.6.manuals/sql-reference-guide/data-definition-language/create-type.md)을 참고합니다.

배열 타입을 생성하기 위해서는 다음과 같이 AS VARRAY를 명시합니다. VARRAY 다음에 오는 괄호 안에 이 배열이 담을 수 있는 구성요소 개수의 최대값을 입력합니다. OF 뒤에 오는 구성요소 타입으로는 내장 타입 또는 사용자 정의 타입의 이름을 명시할 수 있습니다.

**\[예 1] 컬렉션 타입 생성**

```
CREATE TYPE str_varr_type AS VARRAY(10000) OF VARCHAR(100);
/
```

컬렉션 타입 생성은 오브젝트 타입 생성과 마찬가지로 실제 컬렉션을 저장하기 위한 공간을 할당하는 것이 아니며 컬렉션의 모양만을 기술할 뿐입니다. LOB 타입 및 XMLType에 대한 배열 타입은 생성할 수 있지만, 그 타입을 테이블의 컬럼 타입으로 사용할 수는 없습니다. 컬렉션 타입은 테이블의 컬럼 타입, 오브젝트 타입의 Attribute 타입, PSM 내의 변수 및 매개변수, 반환값의 타입으로 사용할 수 있습니다. 오브젝트 테이블의 타입으로는 사용할 수 없습니다.

### 컬렉션(**컬렉션 값**) 생성

컬렉션(컬렉션 값)을 생성하기 위해서는 컬렉션 타입의 이름 다음에 괄호 안에 해당 컬렉션 타입의 구성요소들을 콤마(,)와 함께 나열하여 생성할 수 있습니다.

**\[예 2] 컬렉션(컬렉션 값) 생성**

```
str_varr_type('ABC', 'DEFG', 'HH') 
str_varr_type()
```

괄호 안에 어떤 구성요소 값도 주지 않은 채로 컬렉션을 생성할 때 이것을 빈 컬렉션이라고 합니다. 빈 컬렉션은 컬렉션에 참여하는 구성요소만 없을 뿐 NULL은 아닙니다.

### 다층 컬렉션 타입

컬렉션 타입의 구성요소의 타입이 또 다른 컬렉션 타입이거나, 구성요소의 타입이 오브젝트 타입이고 이 오브젝트 타입의 구성요소 중 하나가 컬렉션 타입일 경우 이것을 다층 컬렉션 타입이라고 합니다. 현재 **SQL** 쿼리에서는 배열로만 다층 컬렉션 타입의 구성이 가능하며 네스티드 테이블과 배열을 섞어서 다층 컬렉션 타입을 구성할 수는 없습니다.

컬렉션 타입을 사용할 수 있는 곳이라면 다층 컬렉션 타입도 사용할 수 있습니다. 다층 컬렉션(컬렉션 값)을 생성할 때도 일반 컬렉션과 마찬가지로 구성요소를 명시합니다. 즉, 다음과 같이 컬렉션 타입 이름을 중첩해서 명시합니다.

**\[예 3] 다층 컬렉션 타입**

```
CREATE OR REPLACE TYPE str_varr_coll_type AS VARRAY(1000) OF str_varr_type;
/

CREATE TABLE nested_coll_tbl (id number, coll_val str_varr_coll_type); 

INSERT INTO nested_coll_tbl VALUES (1,
    str_varr_coll_type(str_varr_type('AB', 'CD'), str_varr_type())); 
INSERT INTO nested_coll_tbl VALUES (2,
    str_varr_coll_type(str_varr_type(), str_varr_type('EF', 'GH')));
```

## 사용 예제

본 절에서는 컬렉션 타입을 사용하는 경우에 따른 사용법을 설명합니다.

### 쿼리에서 사용

컬렉션 타입의 컬럼을 SELECT 절에 직접 명시하면 컬렉션 값이 생성자 형태의 문자열로 표시됩니다. 컬렉션의 각 구성요소를 행 단위로 조회하려면 TABLE() 표현식을 사용합니다. TABLE() 표현식은 FROM 절에서 컬렉션의 각 구성요소를 행으로 변환한 테이블처럼 사용할 수 있게 하는 표현식입니다.

**\[예 4] 쿼리에서의 컬렉션 타입 사용**

```
CREATE TABLE coll_tbl (id number, coll_val str_varr_type);

INSERT INTO coll_tbl VALUES (1, str_varr_type('AB', 'CD')); 
INSERT INTO coll_tbl VALUES (2, str_varr_type('EF', 'GH')); 
INSERT INTO coll_tbl VALUES (3, str_varr_type());

SQL> SET LINESIZE 100
SQL> COL COLUMN_VALUE FORMAT a20
SQL> SELECT id, d.* FROM coll_tbl c, TABLE(c.coll_val) d;

        ID COLUMN_VALUE
---------- --------------------
         1 AB
         1 CD
         2 EF
         2 GH

4 rows selected.
```

TABLE() 표현식의 인자로 공급되는 컬럼은 FROM 절에서 자신의 왼쪽에 있는 테이블의 컬럼 중 컬렉션 타입의 컬럼을 명시할 수 있습니다(이를 위해 일반적으로 위와 같이 테이블 별칭을 사용합니다). 위에서 보는 것처럼 내장 타입 혹은 컬렉션에 대한 컬렉션일 경우 TABLE() 표현식으로 인해 만들어지는 테이블은 COLUMN\_VALUE라고 하는 하나의 컬럼만을 가집니다.<br>

TABLE() 표현식 없이 컬렉션 타입의 컬럼을 SELECT 절에 직접 명시하면 다음과 같이 컬렉션 값이 생성자 형태의 문자열로 표시됩니다.

```
SQL> COL COLL_VAL FORMAT a30
SQL> SELECT coll_val FROM coll_tbl WHERE id = 1;

COLL_VAL
------------------------------
STR_VARR_TYPE('AB', 'CD')

1 row selected.
```

TABLE() 표현식에는 다음과 같이 외부 조인 연산자인 (+)를 사용하여 외부 조인을 수행할 수 있습니다.

**\[예 5] 컬렉션 타입의 외부 조인 Select**

```
SQL> SELECT id, d.* FROM coll_tbl c, TABLE(c.coll_val)(+) d;

        ID COLUMN_VALUE
---------- --------------------
         1 AB
         1 CD
         2 EF
         2 GH
         3

5 rows selected.
```

외부 조인을 수행하지 않으면 빈 컬렉션에 해당하는 행이 SELECT되지 않습니다. 외부 조인을 수행하면 빈 컬렉션에 해당하는 행도 출력됩니다.

서브 쿼리의 결과가 하나의 컬렉션 값을 반환하는 스칼라 서브 쿼리인 경우, 이 서브 쿼리를 TABLE() 표현식의 인자로 지정하여 컬렉션 내용을 풀어 조회할 수 있습니다. 즉, 일반적인 값 표현식에 올 수 있는 스칼라 서브 쿼리만 허용됩니다.

**\[예 6] 서브 쿼리 결과가 컬렉션인 경우**

```
SQL> SELECT * FROM TABLE(SELECT coll_val FROM coll_tbl WHERE id = 1);

COLUMN_VALUE
--------------------
AB
CD

2 rows selected.
```

위 예제의 서브 쿼리에 WHERE 절이 없고 결과 행이 2개 이상이면 TABLE 쿼리는 정상 수행되지 않으며 런타임 오류(TBR-11002)가 발생합니다.<br>

다층 컬렉션에서는 TABLE() 표현식을 반복해서 사용하여 임의 계층의 구성요소를 추출할 수 있습니다. 이때 상위 계층의 TABLE() 표현식이 만드는 컬렉션 컬럼을 다음 계층의 TABLE() 표현식에 명시하려면 테이블 별칭이 필요합니다.

**\[예 7] 다층 컬렉션**

```
SQL> SELECT id, z.* FROM nested_coll_tbl x, TABLE(x.coll_val) y,
                                TABLE(y.COLUMN_VALUE) z;

        ID COLUMN_VALUE
---------- --------------------
         1 AB
         1 CD
         2 EF
         2 GH

4 rows selected.
```

오브젝트에 대한 컬렉션인 경우 TABLE() 표현식이 반환하는 테이블은 오브젝트 테이블이 됩니다. 이 테이블에서는 오브젝트 테이블에서 사용할 수 있는 각종 표현식을 사용할 수 있습니다("[오브젝트 타입의 사용](/tibero-manuals/7.2.6.manuals/development-guide/object-type.md)" 참고). 또한 이 테이블은 COLUMN\_VALUE 컬럼을 가지지 않으며 기반 오브젝트 타입의 Attribute 이름과 같은 이름의 컬럼을 가집니다.

**\[예 8] 컬렉션이 오브젝트에 대한 컬렉션**

```
CREATE TYPE customer_type2 AS OBJECT 
    ( custno NUMBER,
    name VARCHAR2(40), 
    phone VARCHAR2(20),
    MEMBER FUNCTION tostring RETURN VARCHAR);
/

CREATE TYPE BODY customer_type2 AS
    MEMBER FUNCTION tostring RETURN VARCHAR IS 
    BEGIN
        RETURN custno || ':' || name || ':' || phone; 
    END;
END;
/

CREATE OR REPLACE TYPE cust_coll_type AS VARRAY(400) OF customer_type2;
/

CREATE TABLE cust_coll_tab 
    ( id NUMBER,
    coll_val cust_coll_type);

INSERT INTO cust_coll_tab VALUES (1, 
    cust_coll_type(customer_type2(1, 'Bob', '222-333-4444'),
                    customer_type2(2, 'Alice', '444-555-6666')));

SQL> COL NAME FORMAT a10
SQL> COL PHONE FORMAT a15
SQL> COL STR FORMAT a25
SQL> SELECT id, d.*, VALUE(d).tostring() str FROM 
        cust_coll_tab c, TABLE(c.coll_val) d;

        ID     CUSTNO NAME       PHONE           STR
---------- ---------- ---------- --------------- -------------------------
         1          1 Bob        222-333-4444    1:Bob:222-333-4444
         1          2 Alice      444-555-6666    2:Alice:444-555-6666

2 rows selected.
```

### **DML**에서 사용

현재 네스티드 테이블에는 DML이 지원되지 않습니다. 배열은 배열 값 전체를 INSERT하거나 UPDATE할 수 있습니다. 쿼리 내에서 배열의 구성요소를 조작하는 기능은 지원되지 않습니다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.tibero.com/tibero-manuals/7.2.6.manuals/development-guide/collection-type.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
