12.1 버전에서 INVISIBLE 칼럼 기능을 추가되었다.
테스트를 위해 아래와 같이 테이블을 생성하자.
-- 1 DROP TABLE t1 PURGE; CREATE TABLE t1 AS SELECT 1 AS c1, 2 AS c2, 3 AS c3, 4 AS c4, 5 AS c5 FROM DUAL;
c2, c4 열을 INVISIBLE 칼럼으로 변경하고 SELECT * 로 조회하면 해당 칼럼이 조회되지 않는 것을 확인할 수 있다. *_TAB_COLS 뷰를 조회해보면 c2 칼럼과 c4 칼럼의 column_id 값이 표시되지 않는 것을 확인할 수 있다.
-- 2 ALTER TABLE t1 MODIFY c2 INVISIBLE; ALTER TABLE t1 MODIFY c4 INVISIBLE; SELECT * FROM t1; C1 C3 C5 -- -- -- 1 3 5 1개의 행이 선택되었습니다. SELECT column_name, column_id, internal_column_id FROM user_tab_cols WHERE table_name = 'T1'; COLUMN_NAME COLUMN_ID INTERNAL_COLUMN_ID ----------- --------- ------------------ C1 1 1 C2 2 C3 2 3 C4 4 C5 3 5 5 행이 선택되었습니다.
SELECT 절에 열을 직접 기술하면 INVISIBLE 칼럼을 조회할 수 있다.
-- 3 SELECT c1, c2, c3, c4, c5 FROM t1; C1 C2 C3 C4 C5 -- -- -- -- -- 1 2 3 4 5 1개의 행이 선택되었습니다.
c4, c2 열을 순서대로 VISIBLE 칼럼으로 변경하고, SELECT * 로 조회하면 c3 열 다음에 c4, c2 열이 순서대로 표시된다. *_TAB_COLS 뷰를 조회해보면 변경한 순서에 따라 column_id 값이 변경된 것을 확인할 수 있다.
-- 4 ALTER TABLE t1 MODIFY c4 VISIBLE; ALTER TABLE t1 MODIFY c2 VISIBLE; SELECT * FROM t1; C1 C3 C5 C4 C2 -- -- -- -- -- 1 3 5 4 2 1개의 행이 선택되었습니다. SELECT column_name, column_id, internal_column_id FROM user_tab_cols WHERE table_name = 'T1'; COLUMN_NAME COLUMN_ID INTERNAL_COLUMN_ID ----------- --------- ------------------ C1 1 1 C2 5 2 C3 2 3 C4 4 4 C5 3 5 5 행이 선택되었습니다.
INVISIBLE 칼럼의 작동 방식은 칼럼 순서를 변경하는데 활용할 수 있다. 칼럼 순서 변경을 위해 아래와 같이 프로시저를 작성하자.
-- 5 CREATE OR REPLACE PROCEDURE fnc_column_order ( i_owner IN VARCHAR2 , i_table_name IN VARCHAR2 , i_column_name_bf IN VARCHAR2 , i_column_name_af IN VARCHAR2 ) IS l_sql_text VARCHAR2 (4000) := 'ALTER TABLE ' || i_owner || '.' || i_table_name || ' MODIFY '; BEGIN FOR c1 IN (SELECT a.column_name FROM sys.all_tab_columns a WHERE a.owner = i_owner AND a.table_name = i_table_name AND a.column_id > (SELECT NVL (MIN (x.column_id), 0) FROM sys.all_tab_columns x WHERE x.owner = i_owner AND x.table_name = i_table_name AND x.column_name = i_column_name_bf) ORDER BY a.column_id , a.column_name) LOOP IF c1.column_name <> i_column_name_af THEN EXECUTE IMMEDIATE l_sql_text || c1.column_name || ' INVISIBLE'; EXECUTE IMMEDIATE l_sql_text || c1.column_name || ' VISIBLE'; END IF; END LOOP; END usp_column_reordering; /
아래와 같이 프로시저를 실행하면 칼럼의 순서가 원래대로 변경된 것을 확인할 수 있다.
-- 6 EXEC fnc_column_order ('TUNA', 'T1', 'C1', 'C2'); -- c1 칼럼 뒤로 c2 칼럼을 이동 EXEC fnc_column_order ('TUNA', 'T1', 'C3', 'C4'); -- c3 칼럼 뒤로 c4 칼럼을 이동 SELECT c1, c2, c3, c4, c5 FROM t1; C1 C2 C3 C4 C5 -- -- -- -- -- 1 2 3 4 5 1개의 행이 선택되었습니다. SELECT column_name, column_id, internal_column_id FROM user_tab_cols WHERE table_name = 'T1'; COLUMN_NAME COLUMN_ID INTERNAL_COLUMN_ID ----------- --------- ------------------ C1 1 1 C2 2 2 C3 3 3 C4 4 4 C5 5 5 5 행이 선택되었습니다.
'Oracle > Administration' 카테고리의 다른 글
오라클 에러 테이블 (0) | 2018.03.01 |
---|---|
PK 제약조건과 인덱스 #2 (0) | 2014.05.06 |
NUMBER 타입 테스트 (0) | 2014.03.07 |
세션 정보 변경 (0) | 2012.06.25 |
EDITIONING 뷰 테스트 (0) | 2012.05.31 |