LoginSignup
1
3

More than 5 years have passed since last update.

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

Posted at

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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3