文章目录
吐个槽:Oracle数据库有很多地方设计的不人性化,比如,sqlplus中不能像mysql中一样翻历史记录。不能像mysql一样show table就可以看到表创建语句以及索引情况。所以,还要自己去写脚本,希望有脚本能一把梭,像plsql那样展示出表结构以及索引信息。
1、DBMS_METADATA.GET_DDL包详解以及使用案例
1.1、官方文档参考
Database PL/SQL Packages and Types Reference -> 87 DBMS_METADATA
官方文档中详细的说明了包的定义,get_ddl函数等具体用法,信息量比较大,平时常用的不多,本文主要讲查询表结构相关信息。
1.2、常用获取ddl信息案例
1.2.1、查看表以及对应索引创建语句
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(dbms_metadata.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'PRETTY', TRUE);
EXEC DBMS_METADATA.set_transform_param(DBMS_METADATA.session_transform, 'SQLTERMINATOR', TRUE);
select DBMS_METADATA.GET_DDL('TABLE', OBJECT_NAME, OWNER)
FROM Dba_objects
where owner = '&&t_owner'
and object_name = '&&t_name'
and object_type = 'TABLE'
union all
select dbms_metadata.GET_DEPENDENT_DDL('COMMENT', TABLE_NAME, OWNER)
FROM (select table_name, owner
from Dba_col_comments
where owner = '&&t_owner'
and table_name = '&&t_name'
and comments is not null
union
select table_name, owner
from sys.Dba_TAB_comments
where owner = '&&t_owner'
and table_name = '&&t_name'
and comments is not null)
union all
select DBMS_METADATA.GET_DDL('INDEX', INDEX_NAME, OWNER)
FROM (select index_name, owner
from sys.Dba_indexes
where table_owner = '&&t_owner'
and table_name = '&&t_name'
and generated = 'N'
minus
select index_name, owner
from sys.Dba_constraints
where owner = '&&t_owner'
and table_name = '&&t_name')
union all
select dbms_metadata.GET_DDL('TRIGGER', trigger_name, owner)
from Dba_triggers
where table_owner = '&&t_owner'
and table_name = '&&t_name';
1.2.2、获取用户下所有对象的ddl语句
set pagesize 0
set long 90000
set feedback off
set echo off
spool schema.sql
select DBMS_METADATA.GET_DDL('TABLE',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and oject_type = 'TABLE';
select DBMS_METADATA.GET_DDL('VIEW',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and oject_type = 'VIEW';
select DBMS_METADATA.GET_DDL('INDEX',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and oject_type = 'INDEX';
select DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and oject_type = 'PROCEDURE';
select DBMS_METADATA.GET_DDL('FUNCTION',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and object_type = 'FUNCTION';
select DBMS_METADATA.GET_DDL('TRIGGER',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and object_type = 'TRIGGER';
select DBMS_METADATA.GET_DDL('SEQUENCE',u.object_name,owner) from dba_objects u where owner = '&&o_owner' and object_type = 'SEQUENCE';
spool off;
获取单个对象信息时,按照对象类型传入具体的对象名称以及用户名即可,如下:
select dbms_metadata.get_ddl('TABLE','TAB_NAME','SCOTT') from dual;
select dbms_metadata.get_ddl('VIEW','VIEW_NAME','SCOTT') from dual;
select dbms_metadata.get_ddl('INDEX','IDX_NAME','SCOTT') from dual;
1.2.3、单独获取表上约束ddl语句
-- 查看创建主键的SQL
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT',constraint_name,OWNER) FROM dba_constraints where constraint_type = 'C' and owner = '&&u_name';
--查看创建外键的SQL
SELECT DBMS_METADATA.GET_DDL('REF_CONSTRAINT',constraint_name,OWNER) where constraint_type = 'F' and owner = '&&u_name';
来自官方的约束类型解释:
C - Check constraint on a table
P - Primary key
U - Unique key
R - Referential integrity
V - With check option, on a view
O - With read only, on a view
H - Hash expression
F - Constraint that involves a REF column
S - Supplemental logging
1.2.4、获取创建用户以及授权ddl语句
SELECT DBMS_METADATA.GET_DDL('USER',U.username) FROM DBA_USERS U;
select dbms_metadata.get_granted_ddl('ROLE_GRANT',username) from dba_users where username = '&&u_name';
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT',username) from dba_users where username = '&&u_name';
select dbms_metadata.get_granted_ddl('OBJECT_GRANT',username)||";" from dba_users where username = '&&u_name';
1.2.5、获取表空间ddl语句
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name) FROM DBA_TABLESPACES TS;
1.3、dbms_metadata.set_transform_param函数详解
--输出信息采用缩排或换行格式化
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'pretty', true);
--确保每个语句都带分号
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'sqlterminator', true);
--关闭表索引、外键等关联(后面单独生成)
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'constraints', false);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'ref_constraints', false);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'constraints_as_alter', false);
--关闭存储、表空间属性
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'storage', false);
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'tablespace', false);
--关闭创建表的PCTFREE、NOCOMPRESS等属性
exec dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'segment_attributes', false);
2、查看表上列信息,补充desc的功能
Oracle的desc命令看表结构信息,看到的信息有限,从sql developer开发工具中抓到一个挺好用的查看表结构信息的sql语句,可以作为补充:
select c.column_name, case when data_type = 'CHAR' then data_type||'('||c.char_length||decode(char_used,'B',' BYTE','C',' CHAR',null)||')'
when data_type = 'VARCHAR' then data_type||'('||c.char_length||decode(char_used,'B',' BYTE','C',' CHAR',null)||')'
when data_type = 'VARCHAR2' then data_type||'('||c.char_length||decode(char_used,'B',' BYTE','C',' CHAR',null)||')'
when data_type = 'NCHAR' then data_type||'('||c.char_length||decode(char_used,'B',' BYTE','C',' CHAR',null)||')'
when data_type = 'NUMBER' then
case when c.data_precision is null and c.data_scale is null then 'NUMBER'
when c.data_precision is null and c.data_scale is not null then 'NUMBER(38,'||c.data_scale||')'
else data_type||'('||c.data_precision||','||c.data_SCALE||')' end
when data_type = 'NVARCHAR' then data_type||'('||c.char_length||decode(char_used,'B',' BYTE','C',' CHAR',null)||')'
when data_type = 'NVARCHAR2' then data_type||'('||c.char_length||decode(char_used,'B',' BYTE','C',' CHAR',null)||')'
else data_type end data_type,
decode(nullable,'Y','Yes','No') nullable,
c.DATA_DEFAULT,column_id, com.comments
from sys.Dba_tab_Columns c,
sys.Dba_col_comments com
where c.owner = upper('&t_owner')
and c.table_name = upper('&t_name')
and c.table_name = com.table_name
and c.owner = com.owner
and c.column_name = com.column_name
order by column_id;