oracle11g查询表结构、表注释、字段注释并以建表顺序输出

8 篇文章 1 订阅
5 篇文章 0 订阅

select table_name from user_tables; -- 查询当前用户拥有的表

select table_name from all_tables; -- 查询所有用户的表

select table_name from dba_tables; -- 查询系统表

select table_name from dba_tables where owner='用户名'; -- 查询用户名拥有的所有表

select * from user_tab_comments; -- 查询表注释
-- 查询字段注释及字段顺序:
第一种方式

说实话有点儿傻,百度出来的结果,要获取一个表的字段注释和顺序要关联user_tables、user_tab_columns、user_col_comments、user_objects、sys.col$ 5张表。
一个个运行下面的语句才找出关联性

select * from user_tables ut order by ut.table_name;
select * from user_tab_columns utc where utc.table_name = '表名';
select * from user_col_comments ucc where ucc.table_name = '表名';
select uo.obj# from user_objects uo where uo.object_name = '表名';
select sc.name,sc.col# from sys.col$ sc where sc.obj#=uo.obj#  order by sc.col#;
-- 组合
SELECT ucc.table_name,ucc.column_name,ucc.comments,sc.col# FROM user_col_comments ucc
LEFT JOIN user_objects uo
ON uo.OBJECT_NAME = ucc.table_name
AND ucc.table_name NOT LIKE '%BIN$%'
/* 以上的BIN$ 是recyclebin回收站里的表,这个BIN$是唯一的,一个原表可以有多个BIN$前缀的表名

查询字段注释user_col_comments视图的时候会union回收站的表
这个回收站跟Windows的回收站功能差不多,除非你执行清空操作“ purge recyclebin; “这些表才能删除;
另外这些进入回收站的表也可以还原“ flashback table 原表名 to before drop; ”(ps:只要你不怕覆盖)
执行drop table 操作时可以越过回收站“ drop table 表名 purge; ”这样就不会出现在recyclebin里
或者停用recyclebin:1. alter system set recyclebin = off;  2. alter system set “_recyclebin” = false;
*/

LEFT JOIN sys.col$ sc
ON uo.object_id = sc.obj#
AND ucc.column_name = sc.name
ORDER BY ucc.table_name,sc.col#;

第二种方式:
-- 仔细看看下面这个语句执行出来的结果,column_id不就是顺序吗?
select * from user_tab_columns order by table_name,column_id;

-- 关联查询
SELECT ut.TABLESPACE_NAME , -- 数据库名
ut.TABLE_NAME,-- 表名
utc.COLUMN_NAME , -- 字段名
ucc.comments , -- 字段注释
CASE WHEN utc.DATA_TYPE = 'VARCHAR2' OR utc.DATA_TYPE = 'CHAR' THEN CONCAT( CONCAT( CONCAT( utc.DATA_TYPE , '(' ) , utc.DATA_LENGTH ) , ')' )
  WHEN utc.DATA_TYPE = 'NUMBER' AND utc.DATA_PRECISION IS NOT NULL THEN CONCAT(CONCAT(CONCAT(CONCAT(CONCAT(utc.DATA_TYPE, '(' ) , utc.DATA_PRECISION ) , ',' ) , utc.DATA_SCALE) , ')' )
  WHEN utc.DATA_TYPE = 'NUMBER' AND utc.DATA_PRECISION IS NULL THEN CONCAT( CONCAT( CONCAT( utc.DATA_TYPE , '(' ) , utc.DATA_LENGTH ) , ')' )
  ELSE utc.DATA_TYPE
END AS  dataType, -- 字段类型
/*ORACLE的CONCAT()函数只能嵌套使用,一个CONCAT只能放两个参数,mysql的concat()函数用多了,下午突然来任务说源库对接,明天早上要交付,几年没接触Oracle了,没差点给我整懵逼*/
DECODE(utc.NULLABLE,'Y','是','否') AS ISNULLABLE -- 是否能为空
/* DECODE(字段,判断值,TRUE,FALSE)替代mysql的IF(条件,TRUE,FALSE),而且只能判断等值。判断不等只能用case when ... then ... else ... end*/

/*不管加不加as后面都不能用中文,输出后还得改一次表头*/
FROM user_tables ut
INNER JOIN user_tab_columns utc
ON ut.TABLE_NAME = utc.TABLE_NAME
AND ut.TABLESPACE_NAME = '数据库名'
LEFT JOIN user_col_comments ucc
ON ucc.TABLE_NAME = utc.TABLE_NAME
AND ucc.COLUMN_NAME = utc.COLUMN_NAME
ORDER BY ut.TABLE_NAME,utc.COLUMN_ID ASC;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值