oracle元数据获取用户下的表关键信息

了解一个业务系统的数据情况,所有要了解该业务系统的表结构信息及ER关系图。本文主要聊聊通过oracle元数据获取该用户下所有表的关键信息,比如:表名、表描述、字段名、字段描述、字段类型、字段长度、是否主键、是否非空、默认值等。

获取该用户下所有表名和表描述

user_tab_comments表(视图),该表存储的是该用户下所有表和描述

select table_name, comments from user_tab_comments where table_type = 'TABLE';

总共三个字段:

字段名 解释
table_name 表名
table_type 表类型(table、view)
comments 表描述

user_tables表(视图),该表存储该用户下所有表相关信息,包括表的行数(num_rows)、块数(blocks)、字段平均大小(avg_row_len)等信息。

all_tables表(视图),该表存储所有用户下所有表相关信息,表结构和user_table表一样。

dba_tables表(视图),该表存储系统内所有表相关信息,包括系统表,结构和user_table表一样。

获取查看该用户下所以表字段信息(除字段描述)

user_tab_columns表(视图),在sys用户下的视图,来源于user_tab_cols表,存储该用户下所有表的字段信息,不包括字段描述和约束等。

select table_name  --表名
      ,column_name  --字段名
      ,data_type  --字段类型
      ,data_length  --字段长度
      ,data_precision  --字段精度(理解为整数位数)
      ,data_scale  --字段小数位位数
      ,nullable  --是否可为null
      ,data_default  --默认值
  from user_tab_columns
;

该表主要关键字段有如下:

字段名 解释
table_name 表名
column_name 字段名
data_type 字段类型(number、varchar2等)
data_length 字段长度
data_precision 字段精度(比如number类型的整数位)
data_scale 字段小数范围
nullable 是否为空(N:不为空,Y:可为空)
column_id 字段顺序序号
default_length 默认长度
data_default 默认值
num_distinct 字段去重数(count(distinct col))
low_value 字段最小值
high_value 字段最大值
density 密度
num_nulls 空值数
num_buckets 桶数
last_analyzed 最后分析时间(未知具体含义,望大佬解释)
sample_size 样品大小(未知具体含义)
character_set_nane 未知具体含义
char_col_decl_length 未知具体含义
global_stats 整体状态(未知具体含义)
user_stats 用户状态(未知具体含义)
avg_col_len 字段平均长度(可以计算实际存储大小)
char_length 字符长度
char_used 字符单位(B)
v80_fmt_image 未知具体含义
data_upgraded 未知具体含义
histogram 未知具体含义

获取字段描述

user_col_comments表(视图)获取该用户下所有表字段描述

select table_name, columns_nam, comments from user_col_comments;

注: 其中有table_name类似于下图的,这些是被删除存在回收站的表
在这里插入图片描述
该表总共三个字段:

字段名 描述
table_name 表名
column_name 字段名
comments 字段描述

获取表的主键信息

获取主键字段信息

select ucc.table_name, ucc.column_name
  from user_cons_columns ucc, user_constraints uc
 where uc.constraint_name = ucc.constraint_name
   and uc.constraint_type = 'P'
;

user_constraints视图,存储表约束相关信息。
关键字段:

字段名 描述
owner 所有者
constraint_name 约束名称
constraint_type 约束类型(P:主键,U:唯一,F:外键等)
table_name 表名
r_owner 上一个所有者
r_constraint_name 上一个约束名称
index_owner 索引所有者
index_name 索引名称

user_cons_columns视图,存储约束的字段信息。
关键字段:

字段名 描述
owner 所有者
constraint_name 约束名称
table_name 表名
column_name 字段名称
position 位置

获取用户下表关键信息

通过以上表整合获取用户下关键信息

select t1.table_name --表名称
      ,t1.comments as table_comment  --表描述
      ,t2.column_name  --字段名称
      ,t3.comments as column_comment  --字段描述
      --,t2.data_type  --字段类型
      --,t2.data_length  --字段长度
      --,t2.data_precision  --字段精度
      --,t2.data_scale  --字段小数范围
      ,t2.data_type_new  --组合的字段类型
      ,case when t4.table_name is not null then 'Y'
       else null end is_pk  --是否为主键
      ,t2.is_not_null  --是否为空
      ,t2.data_default  --默认值
  from 
  ( --该用户下表名和表描述
  	select table_name, comments
  	  from user_tab_comments 
  	 where table_type = 'TABLE'
  ) t1
  left join
  ( --该用户下表名、字段信息
  	select table_name  --表名
          ,column_name  --字段名
          ,data_type  --字段类型
          ,data_length  --字段长度
          ,data_precision  --字段精度(理解为整数位数)
          ,data_scale  --字段小数位位数
          ,case when nullable = 'N' then 'Y'
           else null end as is_not_null  --是否非空
          ,data_default  --默认值
          ,case when data_precision is not null and data_scale is not null then data_type||'('||data_precision||','||data_scale||')'
                when data_precision is not null and data_scale is null then data_type||'('||data_precision||')'
                when data_precision is null and data_scale is null and data_length is not null then data_type||'('||data_length||')'
           else data_type end as data_type_new
				,column_id	 
      from user_tab_columns
  ) t2 on t1.table_name = t2.table_name
  left join
  (
	--该用户下表名和字段描述
	select table_name
	      ,column_name
	      ,comments
	  from user_col_comments
  ) t3 on t2.table_name = t3.table_name and t2.column_name = t3.column_name
  left join
  ( --该用户下的主键信息
  	select ucc.table_name, ucc.column_name
  	  from user_cons_columns ucc, user_constraints uc
  	 where uc.constraint_name = ucc.constraint_name
       and uc.constraint_type = 'P'
  ) t4 on t2.table_name = t4.table_name and t2.column_name = t4.column_name
 order by t1.table_name, t2.column_id --保证字段顺序和原表字段顺序一致
;

猜你喜欢

转载自blog.csdn.net/lz6363/article/details/111681631