2014-01-26 52 views
2

當我們根據表的列創建函數時,爲什麼在user_tab_cols中創建條目?基於函數的索引和user_tab_cols

create table t1(a varchar2(100), b number); 

select * from user_tab_cols where table_name = 'T1'; -- Two rows coming 

create index idx1 on t1(upper(a)); 

select * from user_tab_cols where table_name = 'T1'; -- Three rows coming 

將條目放在user_tab_cols中的原因是什麼?

+0

你懶得去看看由user_tab_cols返回的數據?你可能已經得到了一個可以回答你的問題的線索。 –

回答

5

額外的列是Oracle添加的virtual column,用於存儲索引表達式的值。從Oracle documentation

Oracle數據庫代表索引表達式作爲一個虛擬列

您可以在SQL輕鬆驗證* Plus的,額外的列是虛擬的。實際上,它也是一個'隱藏'列:

SQL> select column_name, hidden_column, virtual_column from user_tab_cols where table_name = 'T1'; 

COLUMN_NAME     HID VIR 
------------------------------ --- --- 
A        NO NO 
B        NO NO 
SYS_NC00003$     YES YES 

虛擬列的名稱可能在您的計算機上不同。

user_tab_columns過濾出隱藏的列,如Oracle documentation for user_tab_cols中所述。所以,如果你不希望看到這一欄,您可以查詢user_tab_columns而不是user_tab_cols

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

COLUMN_NAME 
------------------------------ 
A 
B 

SQL>