Oracle中一把梭获取对象DDL创建语句


吐个槽: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;

猜你喜欢

转载自blog.csdn.net/u010033674/article/details/107721670