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にすることでテーブル定義の変更を高速化するくらいでしょうか。