[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
时间: 2024-09-29 12:26:05