查看表结构(字段)
这属于常规需求了,不止一种方法。
查看表结构(字段) 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_NAME | COLUMN_NAME | COMMENTS |
---|---|---|
T_USER | ID | ID |
T_USER | USER_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位 |
timestamp | timestamp类型默认就是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信息也拼接到字段里呢,结果卡住了。