oracle

Oracle Database 12cの非表示列を試す

Oracle Database 12cにはSELECT * FROM table文や、SQL*PlusのDESCRIBEコマンドから列を隠す機能が提供されています。

非表示列

非表示列を作るには列属性にINVISIBLEを指定します。元に戻す場合はVISIBLEを指定します。

SQL> CREATE TABLE table1 (c1 CHAR, c2 CHAR INVISIBLE, c3 CHAR) ;

Table created.

INSERT文で列を省略した場合、非表示列は存在しないものとされます。

SQL> INSERT INTO table1 VALUES ('A', 'B', 'C') ;
INSERT INTO table1 VALUES ('A', 'B', 'C')
            *
ERROR at line 1:
ORA-00913: too many values

しかし、列名を指定した場合はINSERT文は成功します。

SQL> INSERT INTO table1(c1, c2, c3) VALUES ('A', 'B', 'C') ;

1 row created.

SELECT * FROM table1文を実行すると、非表示列は表示されませんが、列名をすべて指定すると表示されます。

SQL> SELECT * FROM table1 ;

C1 C3
-- --
A  C

SQL> SELECT c1, c2, C3 FROM table1 ;

C1 C2 C3
-- -- --
A  B  C

SQL*PlusのDESCRIBEコマンドからも非表示列は隠されます。ただしSET COLINVISIBLE ONを実行すると表示されるようになります。

SQL> DESC table1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 C1                                                 CHAR(1)
 C3                                                 CHAR(1)

SQL> SET COLINVISIBLE ON
SQL> DESC table1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 C1                                                 CHAR(1)
 C3                                                 CHAR(1)
 C2 (INVISIBLE)                                     CHAR(1)

非表示列はALL_TAB_COLUMNSビューからは削除されません。しかしCOLUMN_ID列はNULLになります。

SQL> SET NULL NULL
SQL> SELECT COLUMN_NAME, COLUMN_ID FROM USER_TAB_COLUMNS WHERE TABLE_NAME='TABLE1' ORDER BY 2 ;

COLUMN_NAME           COLUMN_ID
-------------------- ----------
C1                            1
C3                            2
C2                   NULL

ALTER TABLE MODIFY文で、非表示列をVISIBLEに戻すことができます。しかし、VISIBLE指定された列は、列定義順序が最後に移動されます。

SQL> ALTER TABLE table1 MODIFY c2 VISIBLE ;

Table altered.

SQL> DESC table1 ;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 C1                                                 CHAR(1)
 C3                                                 CHAR(1)
 C2                                                 CHAR(1)

正直なところこの機能が何の役に立つのかはよくわかりません。アプリケーションの更改前にあらかじめ列定義を足しておいて、更改時にVISIBLEにすることでテーブル定義の変更を高速化するくらいでしょうか。