基于函数的索引和user_tab_cols

时间:2014-01-26 17:46:36

标签: oracle plsql

为什么在基于表的列创建函数时在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中输入条目的原因是什么?

1 个答案:

答案 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>