user_tab_columns和user_tab_cols的区别!

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/19602/viewspace-1002590/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值