Ab Version 12c können Spalten ausgeblendet werden, indem man sie als "invisible" deklariert. Das ist sowohl beim Anlegen einer Tabelle oder Spalte möglich als auch nachträglich.
Das bedeutet aber nicht, dass auf eine solche Spalte nicht zugegriffen werden kann, sondern nur, dass sie ohne Angabe einer expliziten Spaltenliste nicht berücksichtigt wird:
CREATE TABLE UNSICHTBAR
(
A NUMBER,
B NUMBER INVISIBLE,
C NUMBER
);
INSERT INTO UNSICHTBAR
VALUES(1, 1);
INSERT INTO UNSICHTBAR
(A, B, C )
VALUES(2, 2, 2);
SELECT * FROM UNSICHTBAR;
A C
---------- ----------
1 1
2 2
SELECT A, B, C FROM UNSICHTBAR;
A B C
---------- ---------- ----------
1 1
2 2 2
Solange man die Spalte explizit anspricht, kann man also ganz normal mit ihr arbeiten.
Interessant ist, dass TOAD die Spalte beim DESCRIBE mit angibt - und an welcher Position:
DESC UNSICHTBAR -- in SQL*Plus
Name Null? Typ
---------------------------- -------- -----------
A NUMBER
C NUMBER
DESC UNSICHTBAR -- im TOAD
Name Null? Type
---------------------------- -------- ------------
A NUMBER
C NUMBER
B NUMBER
Hier lohnt sich ein Blick ins Data Dictionary:
SELECT column_name, column_id
FROM user_tab_columns
WHERE table_name = 'UNSICHTBAR'
ORDER BY column_id;
COL COLUMN_ID
--- ----------
A 1
C 2
B
Die column_id ist also bei unsichtbaren Spalten nicht gefüllt. Interessanter noch ist die etwas weniger bekannte user_tab_cols:
SELECT column_name, column_id, internal_column_id,
hidden_column, virtual_column
FROM user_tab_cols
WHERE table_name = 'UNSICHTBAR'
ORDER BY internal_column_id;
COL COLUMN_ID INTERNAL_COLUMN_ID HIDDEN_COLUMN VIRTUAL_COLUMN
--- ---------- ------------------ ------------- --------------
A 1 1 NO NO
B 2 YES NO
C 2 3 NO NO
Wenn eine unsichtbare Spalte wieder sichtbar gemacht wird, bekommt sie grundsätzlich die höchste column_id und rückt dementsprechend ans Ende der Spaltenliste:
ALTER TABLE UNSICHTBAR MODIFY (b VISIBLE);
SELECT * FROM UNSICHTBAR;
A C B
---------- ---------- ----------
1 1
2 2 2
SELECT column_name, column_id, internal_column_id,
hidden_column, virtual_column
FROM user_tab_cols
WHERE table_name = 'UNSICHTBAR'
ORDER BY internal_column_id;
COL COLUMN_ID INTERNAL_COLUMN_ID HIDDEN_COLUMN VIRTUAL_COLUMN
--- ---------- ------------------ ------------- --------------
A 1 1 NO NO
B 3 2 NO NO
C 2 3 NO NO
Auf diese Art könnte man beispielsweise auch eine neu eingefügte Spalte, die ja bis 11g grundsätzlich als letzte Spalte angezeigt wird, in der Spaltenliste weiter nach vorne wandern lassen:
ALTER TABLE UNSICHTBAR ADD (e NUMBER);
ALTER TABLE UNSICHTBAR MODIFY (b INVISIBLE, c INVISIBLE);
ALTER TABLE UNSICHTBAR MODIFY (b VISIBLE, c VISIBLE);
SELECT * FROM UNSICHTBAR;
A E B C
---------- ---------- ---------- ----------
1 1
2 2 2
So ganz neu ist das Konzept der unsichtbaren Spalten nicht. Haben Sie sich schon einmal angeschaut, wie eine Spalte vom Typ XMLTYPE intern dargestellt wird?
ALTER TABLE UNSICHTBAR ADD (xml XMLTYPE);
SELECT column_name, column_id
FROM user_tab_columns
WHERE table_name = 'UNSICHTBAR'
ORDER BY column_id;
COLUMN_NAME COLUMN_ID
------------- ----------
A 1
E 2
B 3
C 4
XML 5
SELECT column_name, column_id, internal_column_id,
hidden_column, virtual_column
FROM user_tab_cols
WHERE table_name = 'UNSICHTBAR'
ORDER BY internal_column_id;
COLUMN_NAME COLUMN_ID INTERNAL_COLUMN_ID HIDDEN_COLUMN VIRTUAL_COLUMN
------------- ---------- ------------------ ------------- --------------
A 1 1 NO NO
B 3 2 NO NO
C 4 3 NO NO
E 2 4 NO NO
XML 5 5 NO YES
SYS_NC00006$ 5 6 YES NO
Hier kann die unsichtbare Spalte SYS_NC00006$ prinzipiell auch direkt angesprochen werden. Da es sich aber bei Speicherung des XMLTYPE als binary xml (dem Default in 12c) um einen BLOB handelt, ist das allerdings nicht sehr sinnvoll. Und bei Speicherung als CLOB (deprecated in 12c) bietet es zumindest keine Vorteile.
Das Prinzip ist also ähnlich, auch wenn es offensichtlich Unterschiede im Detail gibt. Interessierte sollten sich die Spalten column_id (hier gefüllt!), segment_column_id, virtual_column und - in Version 12c neu eingeführt - user_generated in user_tab_cols genauer anschauen.
Sie würden gerne wissen, was ist alles neu in 12c? - dann schauen Sie doch in unserer Oracle Schulung Neuerungen 12c vorbei.