为什么在基于表的列创建函数时在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 :(得分: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>