개요
Tibero에서 제공하는 Virtual Column 및 이관 방법에 대해 안내합니다.
Virtual Column
다른 컬럼 값 또는 다른 표현식을 사용하여 자동으로 값이 계산되는 가상 컬럼입니다.
다른 컬럼의 값을 이용해 새로운 값 생성에 사용합니다.
제약조건
•
DB에 저장되지 않고 실행 중에 계산되어 값을 반환합니다.
•
Update, Delete 조건절에는 사용 가능하지만 컬럼값 자체에 대한 변경은 불가능합니다.
•
가상 컬럼 Data를 직접 입력할 수 없습니다.
방법
참고
아래 환경에서 테스트를 진행하였습니다.
•
가상 머신 : Vitrual Box
•
OS : Centos7
•
Tibero : Tibero6 FS06 CS1902
Virtual Column 생성
COLUMN_NAME [DATATYPE] [GENERATED ALWAYS] AS [EXPRESSION] [VIRTUAL]
•
COLUMN_NAME : 가상 컬럼의 이름
•
DATATYPE : 가상 컬럼의 데이터 타입 (생략시 표현식 대한 데이터 유형을 사용)
•
AS EXPRESSION : 가상컬럼에 적용할 표현식
•
GENERATED ALWAYS, VIRTUAL : 해당 컬럼이 가상 컬럼임을 나타내는 구문으로 생략 가능
예시
CREATE TABLE EMP10 (
EMPNO NUMBER CONSTRAINTS PK_EMP10 PRIMARY KEY
ENAME VARCHAR2(50),
PAY NUMBER,
ANNUAL_INCOME NUMBER GENERATED ALWAYS AS (PAY * 12) VIRTUAL
);
SQL
복사
Virtual Column 확인
View : desc dba_tbl_columns
SQL> desc dba_tbl_columns
COLUMN_NAME TYPE CONSTRAINT
-------------------------------------------------------------------
OWNER VARCHAR(128)
TABLE_NAME VARCHAR(128)
COLUMN_NAME VARCHAR(128)
DATA_TYPE VARCHAR(65532)
DATA_TYPE_OWNER VARCHAR(128)
DATA_LENGTH NUMBER
DATA_PRECISION NUMBER
DATA_SCALE NUMBER
NULLABLE VARCHAR(1)
COLUMN_ID NUMBER
DATA_DEFAULT LONG --expression 확인
DEFAULT_LENGTH NUMBER
CHAR_COL_DECL_LENGTH NUMBER
CHAR_LENGTH NUMBER
CHAR_USED VARCHAR(1)
VIRTUAL_COLUMN VARCHAR(1) --virtual column 여부
SQL
복사
예시
create table tb_virtual (c1 number, c2 number, c3 number generated always as (c1 + c2)
virtual);
SQL> select table_name, column_name, data_type, data_default, virtual_column from
dba_tbl_columns where virtual_column='Y';
TABLE_NAME COLUMN_NAM DATA_TYPE DATA_DEFAULT VIRTUAL_COLUMN
---------- ---------- ---------- -------------------- --------------------
TB_VIRTUAL C3 NUMBER ("C1" + "C2") Y
1 row selected.
SQL
복사
Virtual Column 이관
Virtual Column은 데이터를 직접 입력할 수 없는 컬럼이므로 데이터 이관시 TBR-8143: Cannot insert a value in a virtual column. 오류가 발생합니다. 단, CTAS를 통해 복제 테이블을 만드는 경우는 예외이며 일반적인 경우 아래의 방법으로 데이터 이관이 가능합니다.
tbexport, tbimport
Tibero에서 제공하는 유틸리티인 tbexport와 tbimport를 통해 virtual column을 가진 테이블 이관이 가능합니다.
DB link
DB link를 통해 이관시, Virtual Column을 제외한 나머지 컬럼들에 대해서만 select 후 insert 수행 시 정상적인 이관이 가능합니다.
예시
--테이블 생성
create table tb_virtual (c1 number, c2 number, c3 number generated always as (c1
+ c2) virtual );
--디비링크를 통한 데이터 적재
insert /*+ append parallel(8) */ into tb_virtual (c1, c2) select /*+ parallel(8) */ c1,
c2 from tb_virtual@link_t;
commit;
SQL
복사
Tablemigrator
컬럼 순서 변경 기능이 제공되는 버전의 Tablemigrator를 통해 Virtual Column을 소유한 테이블의 데이터 이관이 가능합니다.
예시
--테이블 생성
create table tb_virtual (c1 number, c2 number, c3 number generated always as (c1
+ c2) virtual );
--데이터 적재
insert into tb_virtual(c1, c2) values (10, 10);
insert into tb_virtual(c1, c2) values (10, 10);
insert into tb_virtual(c1, c2) values (10, 10);
commit;
--migrator.properties 설정
SOURCE_TYPE=DEFAULT
SOURCE_DRIVER=com.m.internal.jdbc.MInternalDriver
SOURCE_URL=jdbc:internal:thin:@localhost:8629:tibero
SOURCE_USER=tibero
SOURCE_PASSWORD=tmax
SOURCE_SCHEMA=TIBERO
SOURCE_TABLE=tb_virtual(c1, c2)
TARGET_TYPE=TIBERO
TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver
TARGET_URL=jdbc:internal:thin:@localhost:8629:tibero
TARGET_USER=tibero
TARGET_PASSWORD=tmax
TARGET_SCHEMA=TIBERO
TARGET_TABLE=tb_virtual(c1, c2)
--테이블마이그레이터 수행
sh migrator.sh PROPERTY_FILE=migrator.properties
--수행 결과
## [WARNING] Ignored parameters:
INSERT_THREAD_COUNT
=== Parameters ===
PROPERTY_FILE=migrator.properties
SOURCE_TYPE=DEFAULT
SOURCE_DRIVER=com.m.internal.jdbc.MInternalDriver
SOURCE_URL=jdbc:internal:thin:@localhost:8629:tibero
SOURCE_USER=tibero
SOURCE_PASSWORD=************
SOURCE_SCHEMA=TIBERO
SOURCE_SCHEMAORIGN=TIBERO
SOURCE_TABLE=tb_virtual(c1, c2)
SELECT_SUBPARTITION=
TARGET_TYPE=DEFAULT
TARGET_DRIVER=com.m.internal.jdbc.MInternalDriver
TARGET_URL=jdbc:internal:thin:@localhost:8629:tibero
TARGET_USER=tibero
TARGET_PASSWORD=************
TARGET_SCHEMA=TIBERO
TARGET_TABLE=tb_virtual(c1, c2)
SELECT_FETCH_SIZE=1024
SELECT_AS_BYTE=N
INSERT_BATCH=Y
INSERT_PARALLEL=N
INSERT_THREAD_COUNT=1
INSERT_ZERO_LENGTH_STRING_AS_NULL=Y
==================
SOURCE_SCHEMA : TIBERO
SOURCE_TABLE : tb_virtual(c1, c2)
TARGET_SCHEMA : TIBERO
TARGET_TABLE : tb_virtual(c1, c2)
[E0]1674180265486 - STARTED
[E0]1674180265490 - TOTAL Extracted ROWS: 3 (source schema = TIBERO, source
table = tb_virtual)
[L0]1674180265491 Loader started
[L0]1674180265514 TOTAL Loaded ROWS: 3 (target schema = TIBERO, target table
= tb_virtual)
Loader finished
[VERIFICATION] Source Info : TIBERO.tb_virtual : 3 Rows, Target Info :
TIBERO.tb_virtual : 3 Rows [OK]
Loading is ended.
Elapsed Time (milliseconds) : 160
ADD BATCH : 6
EXECUTE BATCH : 0
--결과 확인
SQL> select * from tb_virtual;
C1 C2 C3
---------- ---------- ----------
10 10 20
10 10 20
10 10 20
10 10 20
10 10 20
10 10 20
6 rows selected.
SQL
복사