株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

12c新機能 不可視列 – Invisible column

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

注意点

マニュアルでも触れられていますが、不可視(INVISIBLE)の列を可視(VISIBLE)にすると、 列の順序が変わる点に注意が必要です。
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(...)の振る舞いが 期待した動作にならないことを示します。要注意ですね。

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ