HIDDENT_COLUMN、VIRTUAL_COLUMN
user_tab_cols视图中有两个字段HIDDENT_COLUMN、VIRTUAL_COLUMN,分别表示 表中的字段是否隐藏、是否是虚拟字段。
HIDDENT_COLUMN:YES是隐藏列,NO不是隐藏列。
VIRTUAL_COLUMN:YES是虚拟列,NO不是虚拟列。
隐藏列:select * 不显示的字段,可能存储于段中,如使用set unused语法处理的字段;也可能不存储于段中(即不占存储空间),如基于函数的索引添加的列。
虚拟列:虚拟列,不存在于段中(即不占存储空间),只在数据字典中记录表达式,如基于函数的索引添加的列。
例:
create table t_hidden
(
name varchar2(24),
dt varchar2(24)
);
insert into t_hidden(name, dt) values('ds01', '20120101030405');
insert into t_hidden(name, dt) values('ds02', '20120102030405');
insert into t_hidden(name, dt) values('ds03', '20120103030405');
commit;
查询字段信息,结果如下:
set lines 180
col table_name for a15;
col column_name for a30;
col data_type for a15;
col data_default for a20;
col hidden_column for a15;
col virtual_column for a15;
select table_name,
column_name,
data_type,
data_default,
hidden_column,
virtual_column
from user_tab_cols
where table_name='T_HIDDEN';
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_DEFAULT HIDDEN_COLUMN VIRTUAL_COLUMN
------------------- ------------------------ ----------------- ----------------------- ---------------------------- ----------------------------
T_HIDDEN DT VARCHAR2 NO NO
T_HIDDEN NAME VARCHAR2 NO NO
创建基于函数的索引:
create index idx_hidden_dt on t_hidden(substr(dt, 1, 8));
再次查询字段信息,结果如下:
set lines 180
col table_name for a15;
col column_name for a30;
col data_type for a15;
col data_default for a20;
col hidden_column for a15;
col virtual_column for a15;
select table_name,
column_name,
data_type,
data_default,
hidden_column,
virtual_column
from user_tab_cols
where table_name='T_HIDDEN';
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_DEFAULT HIDDEN_COLUMN VIRTUAL_COLUMN
-------------------- --------------------------- ----------------- -------------------------- --------------------------- ---------------------------
T_HIDDEN
SYS_NC00003$ VARCHAR2 SUBSTR("DT",1,8) YES YES
T_HIDDEN DT VARCHAR2 NO NO
T_HIDDEN NAME VARCHAR2 NO NO
此时新增了一个字段
SYS_NC00003$,HIDDEN_COLUMN、VIRTUAL_COLUMN字段均显示YES,此列为隐藏虚拟列(此种情况可以通过指定列的名称来显示隐藏虚拟列的内容)。此类字段命名规范如下:
字段名称共5段
1.SYS
2._
3.NC
4.表总字段数(包括虚拟隐藏字段)+1,左补0至5位字符
5.$
如上查询结果SYS_NC00003$
使用set unused语法处理字段:
alter table t_hidden set unused column name;
再次查询字段信息,结果如下:
set lines 180
col table_name for a15;
col column_name for a30;
col data_type for a15;
col data_default for a20;
col hidden_column for a15;
col virtual_column for a15;
select table_name,
column_name,
data_type,
data_default,
hidden_column,
virtual_column
from user_tab_cols
where table_name='T_HIDDEN';
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_DEFAULT HIDDEN_COLUMN VIRTUAL_COLUMN
--------------- --------------------------------------------- ---------------- --------------------------- --------------------------- ---------------------------
T_HIDDEN SYS_NC00003$ VARCHAR2 SUBSTR("DT",1,8) YES YES
T_HIDDEN DT VARCHAR2 NO NO
T_HIDDEN
SYS_C00001_12020119:20:07$ VARCHAR2 YES NO
此时字段name已被重命名为
SYS_C00001_12020119:20:07$,HIDDEN_COLUMN字段显示YES,此列已被隐藏,但不是虚拟列,即在段中还存在,仍占用存储空间(此种情况不再能查询此列内容)。此类字段命名规范如下:
字段名称共7段
1.SYS
2._
3.C
4.原字段序列,左补0至5位字符
5._
6.格式为 RRMMDDHH24:MI:SS 的时间
7.$
如上查询结果SYS_C00001_12020119:20:07$
注:以上为
10g的结果。
11g中新增了虚拟列功能,即可以直接声明虚拟字段,HIDDEN_COLUMN字段为NO,VIRTUAL_COLUMN为YES。详细语法请参考相应文档。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7417681/viewspace-715513/
,如需转载,请注明出处,否则将追究法律责任。