先创建一张测试表:
CREATE TABLE ABC(
A NUMBER,
B NUMBER(22,8),
C NUMBER(8),
D NUMBER(22),
E NUMBER(38),
F INTEGER,
G DATE,
BL BLOB,
CL CLOB,
VAR VARCHAR2(30),
CHR CHAR,
VCHR VARCHAR(20),
NVCHR NVARCHAR2(33),
NCHR NCHAR(3),
TMP TIMESTAMP,
TMP2 TIMESTAMP(8),
BF BFILE,
R RAW(800),
--L LONG,
LR LONG RAW,
FL FLOAT,
FL2 FLOAT(36),
FL3 FLOAT(126),
DE DECIMAL,
DD DECIMAL(8,3)
);
查该表的字段信息:
SELECT A.TABLE_NAME,
A.COLUMN_NAME,
CASE
WHEN A.DATA_TYPE <> 'NUMBER' THEN
A.DATA_TYPE
ELSE
CASE
WHEN A.DATA_PRECISION IS NULL AND A.DATA_SCALE = 0 THEN
'INTEGER'
ELSE
'NUMBER'
END END ||CASE
WHEN DATA_TYPE = 'RAW' THEN
'(' || A.DATA_LENGTH || ')'
WHEN CHAR_LENGTH > 0 THEN
'(' || A.CHAR_LENGTH || ')'
WHEN A.DATA_TYPE NOT IN ('NUMBER','FLOAT') THEN
''
WHEN A.DATA_PRECISION IS NOT NULL AND
NVL(A.DATA_SCALE, 0) <> 0 THEN
'(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')'
WHEN A.DATA_PRECISION IS NOT NULL AND
NVL(A.DATA_SCALE, 0) = 0 THEN
'(' || A.DATA_PRECISION || ')'
ELSE
''
END DATA_TYPE,
A.NULLABLE,
B.COMMENTS
FROM USER_TAB_COLS A, USER_COL_COMMENTS B
WHERE A.TABLE_NAME = B.TABLE_NAME(+)
AND A.COLUMN_NAME = B.COLUMN_NAME(+)
AND A.TABLE_NAME = 'ABC'
ORDER BY A.TABLE_NAME, A.COLUMN_ID;
目前测试没有问题,如果大家发现有不准确的字段表示,请给我留言指正. 非常感谢!
FLOAT虽然不常使用了,但还是要说一说,它默认长度是126, 而且只有DATA_PRECISION字段记录了该长度,DATA_LENGTH与NUMBER类型一样,都是22. 问题是,NUMBER类型,可以根据DATA_PRECISION和DATA_SCALE辨认是否为不带长度的定义(默认定义),但FLOAT却不会使用DATA_SCALE,因此也无法辨认. 所以我这里直接将默认长度也显示出来,观察了下PL/SQL Developer是把126长度的当做默认来处理了(也就是说只要长度为126就不显示该长度)