oracle查看表结构/视图结构、所有表、DBMS、字段等

本文介绍如何使用Oracle的DBMS_METADATA.GET_DDL过程来查询表和视图的DDL语句,这对于理解数据库对象的定义和进行数据库迁移非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看表结构(字段)

这属于常规需求了,不止一种方法。

查看表结构(字段) GET_DDL()方式
SELECT DBMS_METADATA.GET_DDL('TABLE','T_USER') FROM DUAL;

需要注意的是,这几个都是大写:
DBMS_METADATA.GET_DDL
TABLE
T_USER

返回结果是建表语句,类似于mysql的show create table

查看视图结构 GET_DDL()方式

同上,把TABLE换成VIEW即可:

SELECT DBMS_METADATA.GET_DDL('VIEW','T_USER_VIEW') FROM DUAL;
查看表结构(字段) 基于user_col_comments

语句:

select * from user_col_comments where table_name like '%表名%';    

这是一种简便的方式,输出只有3列(TABLE_NAME、COLUMN_NAME、COMMENTS),
适用于快速查看表字段,对表有个了解。输入结果示例:

TABLE_NAMECOLUMN_NAMECOMMENTS
T_USERIDID
T_USERUSER_ACCOUNT账号
查看表结构(字段) 基于user_tab_columns

user_tab_columns的信息比较全,列也很多,这里只列几个常用的列。

user_tab_columns查看字段长度

注:需要有对应权限才可以。

SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH
FROM USER_TAB_COLUMNS 子
WHERE TABLE_NAME = 'MESSAGE_TEMPLATE_RESUME';

查看有多少表

注意记得加owner即可。

这条sql有问题,数量多很多:
SELECT TABLE_NAME FROM all_tables 子;

先分组看下有哪些owner,肯定包含要找的用户及sys用户等:
SELECT owner FROM all_tables 子 group by owner;

带上具体的用户名就是对的了(用这条sql即可)SELECT TABLE_NAME FROM all_tables 子 where  owner='用户名';

DBMS

DBMS是database manage system(数据库管理系统)的简称。
以DBMS_开头的是一套基础方法,例如:
DBMS_METADATA.GET_DDL() # 获取表结构
DBMS_RANDOM.STRING() # 生成随机值

字段

基本的字段

最起码得有这几个字段。

列名 AMOUNT
类型 DECIMAL
长度 22
标度 127
非空 false
注释 金额(字段名一般在注释里)
顺序 2

常见的类型

CHAR #
VARCHAR2 #
NUMBER #
DATE # 这个需要特别注意下,date在数据库长度是7位(世纪年月日时分秒分别占一个字节)
TIMESTAMP(6) # 这个就是timestamp

date、timestamp、timestamp(6)的区别
字段描述
date精度小数点后3位
timestamptimestamp类型默认就是6位
timestamp(6)timestamp类型默认就是6位

有timestamp(6),不由得的想,是否还有timestamp(n)?
确实如此,最多到timestamp(9)。

timestamp的字段
查看字段的sql-基础sql(主要用来拿元数据)

语句:

SELECT
t.column_name AS 列名,
t.data_type AS 类型,
t.data_length AS 长度,
t.char_length AS 字符长度, -- 只有varchar2、char等字符类型有
t.data_precision AS 标度,
t.data_scale AS data_scale,
t.nullable AS 非空,
t2.comments AS 注释, 
t.column_id AS 顺序 -- 并不重要
from user_tab_columns t
inner JOIN 
USER_COL_COMMENTS t2
ON t.column_name=t2.column_name
where t.table_name = '表名'
AND t2.table_name='表名';

注:where条件后为什么要写两个table_name呢,是因为不同表,id等字段都可能重复,如果不都加表名,id会大量重复(不同表间的id)

查看字段的sql(实际用这个)

语句:

SELECT
t.TABLE_name AS 表名,
t.column_name AS 列名,
t.data_type 
	|| CASE 
	WHEN t.data_type ='VARCHAR2' THEN '('|| t.data_length ||')'
	WHEN t.data_type ='CHAR' THEN '('|| t.data_length ||')'
	WHEN t.data_type ='NUMBER' 
	and t.data_precision IS NOT NULL AND t.data_scale is NOT null
	THEN '('|| t.data_precision || ',' || t.data_scale ||')'
	--WHEN 'NUMBER' THEN
	END 
AS 类型及长度精度,
t.nullable AS 非空,
t2.comments AS 注释
from user_tab_columns t
inner JOIN 
USER_COL_COMMENTS t2
ON t.column_name=t2.column_name
where t.table_name = 'T_SCM_VAT_MAIN'
AND t2.table_name='T_SCM_VAT_MAIN'

这里加上table_name是因为迁库时往往是多张表,需要带上表名区分下。

其他

number类型的default为什么不能通过字符串拼接 报错 ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 LONG todo

错误信息:
ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 LONG

好奇怪啊,直接查可以查出来,但是拼接就报错。
本来是计划,default信息也拼接到字段里呢,结果卡住了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值