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)
简单的测试过程如下:
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/19602/viewspace-1002590/