SCOTT@ORA11GR2>select table_name,column_name,data_type,column_id from user_tab_cols where table_name='T1';
TABLE_NAME COLUMN_NAME DATA_TYPE COLUMN_ID
------------ -------------------------- ------------ ---------
T1 SYS_C00003_12122100:34:14$ NUMBER
T1 Y NUMBER 2
T1 X NUMBER 1
SCOTT@ORA11GR2>
--查看user_unused_col_tabs视图,我们会发现有一条记录,两个字段,表名和统计的数量,意思是T1表有一个字段为unused(可见,Oracle在做这个功能的时候,就是不打算让你恢复回来,其实仔细想想不让恢复也是合理的,一是所有涉及到这个字段的相关SQL都需要调整,二是,数据频繁的DML,unused字段一会儿有一会儿没有,数据也就乱了,索性,就不让你恢复了,呵呵)
SCOTT@ORA11GR2>select * from user_unused_col_tabs;
TABLE_NAME COUNT
------------------------------ ----------
T1 1
SCOTT@ORA11GR2>
--我们从all_objects中可以看到,USER_UNUSED_COL_TABS这个对象有两个,一个是视图,一个是同义词
SCOTT@ORA11GR2>col owner for a6
SCOTT@ORA11GR2>col object_name for a22
SCOTT@ORA11GR2>col object_type for a12
SCOTT@ORA11GR2>SELECT owner,object_type,object_name FROM all_objects where object_name='USER_UNUSED_COL_TABS';
OWNER OBJECT_TYPE OBJECT_NAME
------ ------------ ----------------------
SYS VIEW USER_UNUSED_COL_TABS
PUBLIC SYNONYM USER_UNUSED_COL_TABS
SCOTT@ORA11GR2>
--我们不用考虑同义词,直接获取视图的脚本,我们从视图的脚本中可以看到,这个视图就是从基表中直接统计的结果,视图中有几个备注,其中给一个是“is unused columns”,说明,那个条件是判断是否是unused的
SCOTT@ORA11GR2>set long 99999
SCOTT@ORA11GR2>SELECT text FROM all_views where view_name='USER_UNUSED_COL_TABS';
TEXT
--------------------------------------------------------------------------
select o.name, count(*)
from sys.col$ c, sys.obj$ o
where o.obj# = c.obj#
and o.owner# = userenv('SCHEMAID')
and bitand(c.property, 32768) = 32768 -- is unused columns
and bitand(c.property, 1) != 1 -- not ADT attribute col
and bitand(c.property, 1024) != 1024 -- not NTAB's setid col
group by o.name
SCOTT@ORA11GR2>