Oracle/Administration2014. 5. 3. 17:01

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
Posted by 정희락_