技術ブログ
Oracle Database 12cより 不可視(INVISIBLE)という列の属性が追加され、実体としては存在するけれども、明示的に指定しない限り見えない列を作ることができるようになりました。
動作を確認してみましょう。なお、以下のブログエントリを大いに参考にしています。
SQL> CREATE TABLE t1 2 ( 3 c1 NUMBER, 4 c2 NUMBER, 5 c3 NUMBER INVISIBLE, 6 c4 NUMBER 7 ); Table created. SQL> set lines 80 SQL> desc t1 Name Null? Type ------------------------------- -------- ---------------------------- 1 C1 NUMBER 2 C2 NUMBER 3 C4 NUMBER SQL> col column_name format a16 SQL> SELECT column_name, hidden_column FROM ALL_TAB_COLS WHERE table_name = 'T1'; COLUMN_NAME HID ---------------- --- C4 NO C3 YES C2 NO C1 NO
列c3にINVISIBLE属性を指定し、不可視列にしています。SQL*Plusのdescでは列c3は表示されません。 また、ALL_TAB_COLSを確認する列c3はhidden_column='YES'となっていることがわかります。
SQL> INSERT INTO t1 (c1,c2,c3,c4) VALUES (11,12,13,14); 1 row created. SQL> commit; Commit complete. SQL> SELECT c1,c2,c3,c4 FROM t1; C1 C2 C3 C4 ---------- ---------- ---------- ---------- 11 12 13 14 SQL> UPDATE t1 SET c3=23; 1 row updated. SQL> commit; Commit complete. SQL> SELECT c1,c2,c3,c4 FROM t1; C1 C2 C3 C4 ---------- ---------- ---------- ---------- 11 12 23 14
しかし、c3列を明示的に指定すれば、更新などは可能です。
なお、SQL*PlusのCOLINVISIBLEをONにすると、 不可視列がdescコマンドで表示されるようになります。
SQL> SET COLINVISIBLE ON SQL> desc t1 Name Null? Type ------------------------------- -------- ---------------------------- 1 C1 NUMBER 2 C2 NUMBER 3 C4 NUMBER 4 C3 (INVISIBLE) NUMBER SQL> SET COLINVISIBLE OFF
c3列を明示的に指定しない場合は、あたかも列c3がいないかのように振る舞います。
SQL> INSERT INTO t1 VALUES (11,12,13,14); INSERT INTO t1 VALUES (11,12,13,14) * ERROR at line 1: ORA-00913: too many values SQL> SELECT * FROM t1; C1 C2 C4 ---------- ---------- ---------- 11 12 14
SQL> ALTER TABLE t1 MODIFY c3 VISIBLE; Table altered. SQL> desc t1 Name Null? Type ------------------------------- -------- ---------------------------- 1 C1 NUMBER 2 C2 NUMBER 3 C4 NUMBER 4 C3 NUMBER
列の順序が変わるということは、列名を明示しないSQL、SELECT * FROM .. や INSERT INTO 表名 VALUES(...)の振る舞いが 期待した動作にならないことを示します。要注意ですね。