|
|
데이터 정의 및 타입 - 집합형 |
|
|
|
1. 집합형 데이터 타입의 정의와 특성
|
|
1) 정의
|
|
여러 개의 데이터 값을 하나의 속성에 저장할 수 있도록 하는 것은 관계형 데이터베이스의 확장 기능이다. 컬렉션의 각 요소는 서로 다른 데이터 타입이 될 수도 있고, 심지어 서로 다른 클래스(단, 가상 클래스 제외) 도메인으로 가질 수도 있다.
CUBRID는 컬렉션 종류로서 다음과 같은 데이터 타입을 제공한다.
|
|
SET domain
|
|
SET (domain_list)
|
|
LIST or SEQUENCE domain
|
|
LIST or SEQUENCE (domain_list)
|
|
MULTISET domain
|
|
MULTISET (domain_list)
|
|
위의 구문에서 컬렉션 타입을 나타내는 키워드 뒤에 OF를 붙일 수도 있다. 예를 들면, SET domain 대신 SET OF domain으로 쓸 수도 있다. domain이 하나일 때에는 괄호가 필요하지 않으나, 여러 개(즉, domain_list)일 때에는 반드시 괄호로 묶어야 한다.
집합(SET), 다중집합(MULTISET), 그리고 리스트(LIST), 혹은 순차집합(SEQUENCE)의 값은 중괄호('{', '}') 안에 각 값들을 쉼표(,)로 분리하여 나열한다(예: {value_1, value_2, value_n}). 특별하게 컬렉션의 종류가 지정되지 않고, {value_list}가 주어지면 이는 다중집합으로 간주된다. 경우에 따라서는 타입 규칙이 적용될 수도 있다. 예를 들어, 순차집합의 속성에 상수 요소를 추가해도 그 속성은 그대로 순차집합 타입이다.
domain_list는 시스템 기본 데이터 타입, 사용자 정의 클래스 등의 리스트가 될 수 있다. 예를 들어, SET (INTEGER, resort)는 정수 혹은 사용자가 정의한 클래스 resort의 행 값의 집합이 도메인으로 지정되는 경우이다. 만약, SET ( )와 같이 domain_list가 없으면 집합의 요소로서 모든 데이터 타입, 클래스가 허용된다는 뜻이다. 도메인 리스트가 두 개 이상인 경우 요소를 조회할 수 있는 환경은 csql 유틸리티와 C-API를 사용하는 것이다. CUBRID 매니저 및 CUBRID 브로커를 통한 인터페이스(JDBC, ODBC, OLEDB, PHP, CCI)에서는 이러한 컬렉션의 요소를 조회할 수 없다.
|
|
2) 특성
|
|
변환(Coercions)
|
|
SET는 자동적으로 MULTISET로 변환될 수 있다. 명시적인 변환은 CAST 연산자를 이용해야 하는데, 다음과 같은 제약점이 따른다.
|
|
- |
| LIST 또는 SEQUENCE는 LIST, SEQUENCE, SET 또는 MULTISET로 CAST될 수 있다. |
- |
| SET는 SET 또는 MULTISET로 CAST될 수 있다. |
- |
| MULTISET는 MULTISET 또는 SET로 CAST될 수 있다. |
|
|
2. SET
|
|
SET는 각 요소가 서로 다른 값을 갖는 집합이다. SET의 요소는 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있다.
|
|
1) 예제
|
|
정 의
|
컬렉션 값의 예
|
SET(VARCHAR(20), INTEGER)
|
{'golf', 'handicap', 10}
|
SET CHAR(5)
|
{'aaa', 'bbbb', 'ccccc'}
|
|
|
아래는 SET에서 중복을 없애는 예를 보이고 있다.
|
|
정 의
|
입력 데이터
|
저장 데이터
|
SET VARCHAR(10)
|
{'golf', 'scuba', 'golf'}
|
{'golf', 'scuba'}
|
|
|
2) 주의 사항
|
|
만약, 중복된 값이 포함되어 있으면 자동으로 중복을 제거한다.
|
|
3. MULTISET
|
|
MULTISET는 중복이 허용되는 집합이다. MULTISET의 요소는 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있다.
|
|
1) 예제
|
|
정 의
|
컬렉션 값의 예
|
MULTISET INTEGER
|
{10, 20, 10, 80}
|
MULTISET CHAR(5)
|
{'aaa', 'bbbb', 'ccccc'}
|
|
|
4. LIST 또는 SEQUENCE
|
|
LIST(=SEQUENCE)는 요소의 입력된 순서가 유지되는 컬렉션 타입으로 중복이 허용된다. LIST의 요소는 여러 종류의 데이터 타입을 가질 수 있고, 다른 클래스의 인스턴스를 가질 수도 있다.
|
|
1) 예제
|
|
정 의
|
컬렉션 값의 예
|
SEQUENCE INTEGER
|
{20, 40, 60, 80}
|
LIST CHAR(5)
|
{'aaa', 'bbbb', 'ccccc'}
|
|
|