使用dbms_metadata生成建表语句

简介: 有时候在工作中,可以使用exp/imp得到表的创建语句。 如果想得到关于table,index,constraint的语句,可以考虑使用dbms_metadata来实现。

有时候在工作中,可以使用exp/imp得到表的创建语句。
如果想得到关于table,index,constraint的语句,可以考虑使用dbms_metadata来实现。
我们可以使用如下的脚本来得到建表语句,对应的索引语句,和ref_constraint语句。
建表语句就不多说了,关于索引的部分,过滤了主键和唯一性索引的部分,这些语句会和建表语句中的constraint有一定的冲突,而foreign key的语句在建表语句中也不建议使用,这样会对其他表产生依赖,可以考虑单独生成这部分的语句,最后执行。
所以整个脚本会分为3个部分,建表语句,创建索引的语句和ref_constraint的部分。
sqlplus -s n1/n1 SET SERVEROUTPUT ON;
SET LINESIZE 500;
SET FEEDBACK OFF;
set long 99999999     ;  
SET PAGESIZE 1000 ; 
set head off;
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',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);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',true);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'REF_CONSTRAINTS',false);
spool image_copy_$1.sql
select 'select  DBMS_METADATA.GET_DDL('||chr(39)||'TABLE'||chr(39)||','||chr(39)||table_name||chr(39)||','||chr(39)||owner||chr(39)||') sql_text from dual; 'FROM all_tables where owner=sys_context('USERENV','current_user')  and table_name =upper('$1');
spool off;
col sql_text format a300
spool image_copy_$1.log
@image_copy_$1.sql
spool off

spool ref_constraint_$1.sql
select 'select  DBMS_METADATA.GET_DDL('||chr(39)||'REF_CONSTRAINT'||chr(39)||','||chr(39)||constraint_name||chr(39)||','||chr(39)||owner||chr(39)||') sql_text from dual; 'FROM all_constraints where owner=sys_context('USERENV','current_user')  and table_name =upper('$1') and constraint_type='R';
spool off;
col sql_text format a300
spool ref_constraint_$1.log
@ref_constraint_$1.sql
spool off
spool index_$1.sql
select 'select  DBMS_METADATA.GET_DDL('||chr(39)||'INDEX'||chr(39)||','||chr(39)||index_name||chr(39)||','||chr(39)||owner||chr(39)||') sql_text from dual;'FROM all_indexes where owner=sys_context('USERENV','current_user')  and table_name =upper('$1') and index_name in (
select index_name from user_indexes where table_name='$1' and index_name not in (select constraint_name from user_constraints where constraint_type in ('P','U' ) and UNIQUENESS='UNIQUE')
union
select index_name from user_indexes where table_name='$1' and index_name in (select constraint_name from user_constraints where constraint_type='C' ) and UNIQUENESS='NONUNIQUE'
);

spool off;
col sql_text format a300
spool index_$1.log
@index_$1.sql
spool off
EOF

 

运行脚本得到一个简单的例子。
  CREATE TABLE "N1"."PM9_CRDT_LMT_NOTIFICATION"
   (    "CYCLE_CODE" NUMBER(2,0) DEFAULT 0 CONSTRAINT "PM9CRDLT_CYCLE_CODE_NN" NOT NULL ENABLE,
        "CYCLE_MONTH" NUMBER(2,0) CONSTRAINT "PM9CRDLT_CYCLE_MONTH_NN" NOT NULL ENABLE,
        "SYS_CREATION_DATE" DATE CONSTRAINT "PM9CRDLT_SYS_CREATION_DATE_NN" NOT NULL ENABLE,
        "SYS_UPDATE_DATE" DATE,
        "OPERATOR_ID" NUMBER(9,0),
        "APPLICATION_ID" CHAR(6),
        "DL_SERVICE_CODE" CHAR(5),
        "DL_UPDATE_STAMP" NUMBER(4,0),
        "CYCLE_YEAR" NUMBER(4,0) CONSTRAINT "PM9CRDLT_CYCLE_YEAR_NN" NOT NULL ENABLE,
        "CUSTOMER_ID" NUMBER(9,0) CONSTRAINT "PM9CRDLT_CUSTOMER_ID_NN" NOT NULL ENABLE,
        "AGREEMENT_ID" NUMBER(9,0) CONSTRAINT "PM9CRDLT_AGREEMENT_ID_NN" NOT NULL ENABLE,
        "OFFER_INSTANCE" NUMBER(9,0) CONSTRAINT "PM9CRDLT_OFFER_INSTANCE_NN" NOT NULL ENABLE,
        "ITEM_ID" NUMBER(9,0) CONSTRAINT "PM9CRDLT_ITEM_ID_NN" NOT NULL ENABLE,
        "UNBILLED_UC_AMOUNT" NUMBER(11,4),
        "LAST_THRESHOLD" NUMBER(11,4),
        "LAST_ACTUAL_THRESHOLD" NUMBER(11,4),
        "CREDIT_LIMIT" NUMBER(11,4),
        "TOTAL_OBLIGATION" NUMBER(11,4),
        "HOLIDAY_IND" VARCHAR2(1),
         CONSTRAINT "PM9_CRDT_LMT_NOTIFICATION_PK" PRIMARY KEY ("CYCLE_CODE", "CYCLE_MONTH", "CYCLE_YEAR", "CUSTOMER_ID", "AGREEMENT_ID", "OFFER_INSTANCE", "ITEM_ID") ENABLE
   ) ;

可以看到得到的语句是期望之中的,如果有其他的索引信息,也都能得到相应的语句。


 

目录
相关文章
|
4月前
|
存储 SQL 关系型数据库
CREATE TABLE语句
在MySQL中,使用CREATE TABLE语句来创建表。你需要指定表名和列的定义,包括列名、数据类型以及约束等,结合实际存储和上一课学习的数据类型选取合适的。创建一个book_types表
154 0
|
SQL 数据库
CREATE TABLE 语句
CREATE TABLE 语句
106 1
|
SQL 算法 关系型数据库
开发指南—DDL语句—分区表语法—CREATE TABLE
本文主要介绍使用DDL语句进行建表的语法、子句、参数和基本方式
|
SQL 关系型数据库 MySQL
开发指南—DDL语句—分区表语法—DROP TABLE
您可以使用DROP TABLE语法删除指定表。
|
SQL 关系型数据库 MySQL
开发指南—DDL语句—分区表语法—ALTER TABLE
您可以通过ALTER TABLE语法改变表的结构,如增加列、增加索引、修改数据定义等
160 0
|
存储 SQL 固态存储
【DB吐槽大会】第2期 - PG 32位xid
大家好,这是DB吐槽大会,第2期 - PG 32位xid
|
存储 SQL NoSQL
PostgreSQL数据目录深度揭秘
PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS),被业界誉为“先进的开源数据库”,支持NoSQL数据类型,主要面向企业复杂查询SQL的OLTP业务场景,提供PostGIS地理信息引擎、阿里云自研多维多模时空信息引擎等。本文着重介绍PostgreSQL的数据目录,其中保存着配置文件、数据文件、事务日志和WAL日志等重要文件,所有客户创建的数据文件和初始配置文件都可以在数据目录中找到,因此数据目录是重要的客户价值所在。
PostgreSQL数据目录深度揭秘
|
存储 Cloud Native 安全
云原生数据库 2.0:一站式全链路数据管理与服务
5月29日,阿里云开发者大会上,阿里云数据库宣布「云原生数据库 2.0:一站式全链路数据管理与服务」的全新品牌理念及开源云原生数据库能力,首次从客户场景视角提出了一站式在线数据管理平台的理念。
17505 0
云原生数据库 2.0:一站式全链路数据管理与服务
|
存储 弹性计算 算法
PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem
标签 PostgreSQL , 垃圾回收 , 索引扫描 , 内存 背景 夜谈PostgreSQL 垃圾回收参数优化之 - maintenance_work_mem , autovacuum_work_mem。 http://www.postgres.cn/v2/news/viewone/1/398 https://rhaas.blogspot.com/2019/01/how-much
2504 0
|
存储 SQL Perl
PostgreSQL plpgsql 存储过程、函数 - 状态、异常变量打印、异常捕获... - GET [STACKED] DIAGNOSTICS
标签 PostgreSQL , GET , STACKED , DIAGNOSTICS 背景 使用GET STACKED DIAGNOSTICS捕获异常时的STACK内容。 使用GET DIAGNOSTICS捕获运行过程中的状态值。
4339 0