[20130721]ORACLE 12C Invisible Columns.txt

lfree發表於2013-07-23
[20130721]ORACLE 12C Invisible Columns.txt

在ORACLE 12C中有了Invisible Columns的概念,就是在表中真實的存在該列,但是透過設定Invisible可以實現不顯示該列。
自己測試看看。

SQL> select banner from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE    12.1.0.1.0      Production
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

SQL> create table t (a number,b number ,c number);
Table created.

SQL> select object_id,data_object_id from dba_objects where wner=user and object_name='T';
 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     92476          92476

SQL> select obj#,col#,segcol#,SEGCOLLENGTH,OFFSET, NAME,TYPE#,LENGTH , INTCOL# from sys.col$ where obj#= 92476;
      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL#
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ----------
     92476          1          1           22          0 A                             2         22       1
     92476          2          2           22          0 B                             2         22       2
     92476          3          3           22          0 C                             2         22       3

--因為我建立的是普通表,注意看COL#,SEGCOL#,INTCOL#相同。
--intcol#為建立表時的列順序,col#初始情況下跟intcol#相同。而segcol#表示列在資料段上儲存時的順序。
--如果是IOT,cluster table可能不同。

SQL> ALTER TABLE t MODIFY (a invisible);
Table altered.

SQL> select obj#,col#,segcol#,SEGCOLLENGTH,OFFSET, NAME,TYPE#,LENGTH , INTCOL# from sys.col$ where obj#= 92476;
      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL#
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ----------
     92476          0          1           22          0 A                             2         22       1
     92476          1          2           22          0 B                             2         22       2
     92476          2          3           22          0 C                             2         22       3

SQL> ALTER TABLE t MODIFY (a visible);
Table altered.

SQL> select obj#,col#,segcol#,SEGCOLLENGTH,OFFSET, NAME,TYPE#,LENGTH , INTCOL# from sys.col$ where obj#= 92476;
      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL#
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ----------
     92476          3          1           22          0 A                             2         22       1
     92476          1          2           22          0 B                             2         22       2
     92476          2          3           22          0 C                             2         22       3

--可以發現COL#的順序發現了變化,利用這個特性可以實現修改顯示select *時列的展示順序(Column Ordering)。

SQL> set linesize 40
SQL> desc t;
 Name              Null?    Type
 ----------------- -------- ------------
 B                          NUMBER
 C                          NUMBER
 A                          NUMBER

--但是要注意如果插入資料:
insert into t values(1,2,3);
commit ;

SQL> select * from t;
         B          C          A
---------- ---------- ----------
         1          2          3

-- 實際上按照desc t顯示的順序,如果你看資料塊,可以發現保持A,B,C的順序。

SQL> @lookup_rowid AAAWk8AAJAAAACtAAA
    OBJECT       FILE      BLOCK        ROW DBA
---------- ---------- ---------- ---------- --------------------
     92476          9        173          0 9,173

SQL> alter system dump datafile 9 block 173 ;
System altered.

Block header dump:  0x024000ad
 Object id on Block? Y
 seg/obj: 0x1693c  csc: 0x00.28e176  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x24000a8 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.020.00000869  0x01402866.0111.21  --U-    1  fsc 0x0000.0028e177
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x024000ad
data_block_dump,data header at 0x179d6064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x179d6064
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f8c
avsp=0x1f78
tosp=0x1f78
0xe:pti[0]    nrow=1    ffs=0
0x12:pri[0]    ffs=0x1f8c
block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [ 2]  c1 04
col  1: [ 2]  c1 02
col  2: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 3 file#: 9 minblk 173 maxblk 173

SQL> select dump(A,16) c20 ,dump(b,16) c20,dump(c,16) c20 from t ;
C20                  C20                  C20
-------------------- -------------------- --------------------
Typ=2 Len=2: c1,4    Typ=2 Len=2: c1,2    Typ=2 Len=2: c1,3
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-766892/,如需轉載,請註明出處,否則將追究法律責任。

相關文章