Varray 타입 칼럼은 내부적으로 VARCAR2 타입이나 CLOB 타입에 데이터를 저장합니다.
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
CREATE OR REPLACE TYPE tva_number FORCE IS VARRAY(32767) OF NUMBER;
/
CREATE TABLE t1 (c1 NUMBER, c2 tva_number);
INSERT INTO t1 VALUES (1, tva_number (1, 2));
COMMIT;
아래는 t1 테이블을 조회하는 쿼리의 실행 계획입니다.
-- 2
SELECT * FROM t1;
-----------------------------------------------------
| Id | Operation | Name | A-Rows | Buffers |
-----------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 |
| 1 | TABLE ACCESS FULL| T1 | 1 | 7 |
-----------------------------------------------------
*_TAB_COLS 뷰를 조회하면 데이터 타입이 TVA_NUMBER로 표시되지만, *_LOBS 뷰를 조회하면 CLOB 칼럼이 생성된 것을 확인할 수 있습니다.
-- 3-1
SELECT column_name, data_type, hidden_column, virtual_column, user_generated
FROM user_tab_cols
WHERE table_name = 'T1';
COLUMN_NAME DATA_TYPE HIDDEN_COLUMN VIRTUAL_COLUMN USER_GENERATED
----------------- ---------- ------------- -------------- --------------
C1 NUMBER NO NO YES
C2 TVA_NUMBER NO NO YES
2 행이 선택되었습니다.
-- 3-2
SELECT column_name, segment_name FROM user_lobs WHERE table_name = 'T1';
COLUMN_NAME SEGMENT_NAME
----------- -------------------------
C2 SYS_LOB0000084473C00002$$
1개의 행이 선택되었습니다.
블록 덤프를 생성하기 위해 아래와 같이 파일 번호와 블록 번호를 조회하겠습니다.
-- 4
SELECT DBMS_ROWID.ROWID_RELATIVE_FNO (ROWID) AS fno
, DBMS_ROWID.ROWID_BLOCK_NUMBER (ROWID) AS bno
FROM t1;
FNO BLKNO
--- -----
13 133
1개의 행이 선택되었습니다.
c2 칼럼은 37바이트에 저장되어 있습니다. 참고로 BasicFile LOB은 36 바이트, SecureFile LOB은 32 바이트의 오버헤드를 가집니다. 실제 데이터는 마지막 5 바이트인 'c1 02 02 c1 03'입니다.
-- 5
ALTER SYSTEM DUMP DATAFILE 13 BLOCK 133;
block_row_dump:
tab 0, row 0, @0x1f6c
tl: 44 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [37]
00 01 00 00 00 00 00 01 00 00 01 9a 85 5e 00 17 48 90 00 11 00 00 0d 01 88
01 0d 01 01 00 02 02 c1 02 02 c1 03
end_of_block_dump
'c1 02'는 1, 'c1 03'은 2이고, '02'는 구분자인 것으로 보입니다.
SELECT UTL_RAW.CAST_TO_NUMBER (REPLACE ('c1 02', ' ')) AS c1
, UTL_RAW.CAST_TO_NUMBER (REPLACE ('c1 03', ' ')) AS c2
FROM DUAL;
C1 C2
-- --
1 2
1개의 행이 선택되었습니다.