浏览 2967 次
锁定老帖子 主题:查询ORACLE字段信息
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-07
最后修改:2011-09-28
先创建一张测试表: 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就不显示该长度) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-09-10
偶测试过两个表之间三个case判断,数据量到达十万以上速度就有问题,万元左右还是很能接受的……
|
|
返回顶楼 | |
发表时间:2011-09-12
文章虽然修改过,论坛上竟然没有更新...
http://czwlucky.iteye.com/blog/1167908 |
|
返回顶楼 | |