user_tab_columns和user_tab_cols的區別!

warehouse發表於2008-04-15

user_tab_cols differs from "USER_TAB_COLUMNS" in that hidden columns are not filtered out。10.2版本中user_tab_cols比user_tab_columns多出下面幾列:

HIDDEN_COLUMN VARCHAR2(3)
VIRTUAL_COLUMN VARCHAR2(3)
SEGMENT_COLUMN_ID NUMBER
INTERNAL_COLUMN_ID NOT NULL NUMBER
QUALIFIED_COL_NAME VARCHAR2(4000)

[@more@]

簡單的測試過程如下:

SQL> desc tt
名稱 是否為空? 型別
----------------------------------------- -------- ----------------------------

ID NOT NULL NUMBER(38)
NAME VARCHAR2(10)
AGE NUMBER(38)
COL_HIDDEN_TEST CHAR(1)

SQL> alter table tt set unused column col_hidden_test;

表已更改。

SQL> select column_name,hidden_column,virtual_column,
2 segment_column_id scid,internal_column_id icid,
3 qualified_col_name
4 from user_tab_cols where table_name='TT'
5 order by segment_column_id;

COLUMN_NAME HID VIR SCID ICID QUALIFIED_COL_NAME
-------------------------- --- --- ---- ---- --------------------------
ID NO NO 1 1 ID
NAME NO NO 2 2 NAME
AGE NO NO 3 3 AGE
SYS_C00004_08041522:48:47$ YES NO 4 4 SYS_C00004_08041522:48:47$

SQL> select column_name from user_tab_columns where table_name='TT';

COLUMN_NAME
--------------------------
ID
NAME
AGE

SQL>

被設定為unused 的column在user_tab_columns裡面沒有了記錄,而在user_tab_cols中是有記錄的。

另外值得一提的是VIRTUAL_COLUMN是11g的新特性,這裡為什麼會出現在10g的關於user_tab_cols的描述中?莫非10g中VIRTUAL_COLUMN有另外的含義?

下面是11g中VIRTUAL_COLUMN的一點測試:

SQL> create table test(col1 int, col2 int,i3 as (col1+col2) virtual);

表已建立。

SQL> create table test1(col1 int, col2 int,i3 as (col1+col2));

表已建立。

SQL> insert into test values(1,2,3);
insert into test values(1,2,3)
*
第 1 行出現錯誤:
ORA-54013: 不允許對虛擬列執行 INSERT 操作

SQL> insert into test(col1,col2) values(1,2);

已建立 1 行。

SQL> select * from test;

COL1 COL2 I3
---------- ---------- ----------
1 2 3

SQL> commit;

提交完成。

SQL>
SQL> select column_name,hidden_column,virtual_column,
2 segment_column_id scid,internal_column_id icid,
3 qualified_col_name
4 from user_tab_cols where table_name='TEST'
5 order by segment_column_id;

COLUMN_NAME HID VIR SCID ICID QUALIFIED_COL_NAME
-------------------------- --- --- ---- ---- --------------------------
COL1 NO NO 1 1 COL1
COL2 NO NO 2 2 COL2
I3 NO YES 3 I3

SQL> select column_name from user_tab_columns where table_name='TEST';

COLUMN_NAME
--------------------------
COL1
COL2
I3

SQL>

這裡的虛擬列儘管在 user_tab_cols 中的欄位virtual_column=YES

但是在欄位在user_tab_columns 中同樣有記錄,和10g中user_tab_cols 中virtual_column意義存在一些差別:

10g中建立的函式index表現出來的也是virtual_column的特性。

SQL> create index idx_tt on tt(upper(name));

索引已建立。

SQL> select column_name from user_tab_columns where table_name='TT';

COLUMN_NAME
------------------------------
ID
NAME
AGE
SQL> select column_name,hidden_column,virtual_column,
2 segment_column_id scid,internal_column_id icid,
3 qualified_col_name
4 from user_tab_cols where table_name='TT'
5 order by segment_column_id;

COLUMN_NAME HID VIR SCID ICID QUALIFIED_COL_NAME
-------------------------- --- --- ---- ---- ------------------------------
ID NO NO 1 1 ID
NAME NO NO 2 2 NAME
AGE NO NO 3 3 AGE
SYS_C00004_08041522:48:47$ YES NO 4 4 SYS_C00004_08041522:48:47$
SYS_NC00005$ YES YES 5 SYS_NC00005$

SQL>

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