一、概述
如何查看表字段的类型呢?我们可以通过user_tab_columns(或者user_tab_cols)视图进行查看。此外还有dba_tab_columns/dba_tab_cols和all_tab_columns/all_tab_cols视图也可以进行查看,只是查看的对象范围不一样而已。先来看看user_tab_columns的结构。
主要的列属性有:
TABLE_NAME
表、视图或Clusters名称
COLUMN_NAME
列名
COLUMN_ID
列ID
DATA_TYPE
数据类型
DATA_TYPE_MOD
Datatype modifier of the column
DATA_TYPE_OWNER Owner
of the datatype of the column
DATA_LENGTH
长度
DATA_PRECISION
精度
DATA_SCALE 小数点后位数
NULLABLE
是否允许为空
DEFAULT_LENGTH
默认值长度
DATA_DEFAULT
默认值
CHAR_LENGTH
列最大程度,用字符串表示
而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)
而且存储内容多了隐藏字段。这些隐藏字段是Oracle自动添加的,并且设置HIDDEN_COLUMN和VIRTUAL_COLUMN都是YES。看oracle的脚本可以发现视图USER_TAB_COLUMNS就是根据视图USER_TAB_COLS创建的。所以使用时一般使用uer_tab_columns以避免取到隐藏字段。
二、例子
1.查看emp表的列ID,列名和数据类型。
select column_id,column_name,data_type
from user_tab_columns where table_name = 'EMP';
结果如下:
COLUMN_ID
COLUMN_NAME DATA_TYPE
----------
----------
----------
1
EMPNO
NUMBER
2
ENAME
VARCHAR2
3
JOB
VARCHAR2
4
MGR
NUMBER
5
HIREDATE
DATE
6
SAL
NUMBER
7
COMM
NUMBER
8
DEPTNO
NUMBER
2.这里得到的字段类型是粗糙的,如果要得到varchar2(100)这样完整的字段怎么办呢?别急,user_tab_columns还有其他字段保存了我们需要的信息,我们可以通过拼接得到完整的字段类型信息。
select TABLE_NAME ,column_id
,COLUMN_NAME,
DATA_TYPE ||
decode(DATA_TYPE, 'DATE', '', '(' ||
nvl(DATA_PRECISION, data_length) ||
nvl2(nullif(DATA_SCALE, 0), ',' || data_scale, '') || ')')
data_type
from user_tab_columns where
table_name = 'EMP';
结果如下:
TABLE_NAME COLUMN_ID
COLUMN_NAME DATA_TYPE
---------- ---------- ------------- -------------
EMP
1
EMPNO
NUMBER(4)
EMP
2
ENAME
VARCHAR2(10)
EMP
3
JOB
VARCHAR2(9)
EMP
4
MGR
NUMBER(4)
EMP
5
HIREDATE
DATE
EMP
6
SAL
NUMBER(7,2)
EMP
7
COMM
NUMBER(7,2)
EMP
8
DEPTNO
NUMBER(2)
再来看看desc emp的结果:
Name
Type
-------- ------------
EMPNO
NUMBER(4)
ENAME
VARCHAR2(10)
JOB
VARCHAR2(9)
MGR
NUMBER(4)
HIREDATE
DATE
SAL
NUMBER(7,2)
COMM
NUMBER(7,2)
DEPTNO
NUMBER(2)
通过比较发现,数据类型完全一致。