Auswahl  

Unsichtbare Spalten 

Oracle
SQL
RDBMS 12.2
26.06.18 (MP)
04.07.18 (MP)
Oracle Neuerungen, SQL, 12C Release 1

Body

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 eigefü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.

 

 

Besuchen Sie uns doch bei einer unsere über 40 Oracle Schulungen in München - Unterhaching.