一、概述
如何查看表字段的类型呢?我们可以通过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)
通过比较发现,数据类型完全一致。