使用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
   ) ;

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


 

目录
相关文章
|
存储 安全 Shell
⭐⭐【Shell 命令集合 文件传输 】Linux ftp工具 使用指南
⭐⭐【Shell 命令集合 文件传输 】Linux ftp工具 使用指南
378 0
|
4天前
|
安全 Java 数据库连接
SpringBoot使用小汇总
Spring Boot基于Spring框架,通过“约定优于配置”和丰富Starter依赖,简化企业级Java应用开发。具备零配置、内嵌服务器、自动依赖管理及生产级特性,适用于微服务与单体架构。本文从核心特性、开发实践、性能优化与生态扩展四方面深入解析。
106 2
|
3月前
|
API 开发工具 Android开发
【HarmonyOS 5】鸿蒙中进度条的使用详解
【HarmonyOS 5】鸿蒙中进度条的使用详解
223 7
|
11月前
|
机器学习/深度学习 人工智能 运维
智能运维:大数据与AI的融合之道###
【10月更文挑战第20天】 运维领域正经历一场静悄悄的变革,大数据与人工智能的深度融合正重塑着传统的运维模式。本文探讨了智能运维如何借助大数据分析和机器学习算法,实现从被动响应到主动预防的转变,提升系统稳定性和效率的同时,降低了运维成本。通过实例解析,揭示智能运维在现代IT架构中的核心价值,为读者提供一份关于未来运维趋势的深刻洞察。 ###
388 10
|
运维 负载均衡 算法
SLB与NGINX的异同是什么
SLB与NGINX的异同是什么
1537 2
|
弹性计算 运维 算法
ECS稳定性体系建设与最佳实践|开发者分享会
今天分享的内容来自阿里云弹性计算技术专家杜文彬的“ECS稳定性体系建设与最佳实践”。全文围绕阿里云ECS稳定性体系建设、云上应用稳定性最佳实践这2个主题内容进行讲解。
|
Linux
CentOS如何修改SEMMNI
【6月更文挑战第18天】CentOS如何修改SEMMNI
645 1
|
XML Cloud Native Dubbo
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南(一)
【Dubbo3高级特性】「提升系统安全性」手把手教你如何通过令牌进行Dubbo3服务验证及服务鉴权控制实战指南
745 1
|
人工智能 JavaScript 开发工具
【完全免费】VS Code 最好用的 12 款 AI 代码提示插件!!!
🎉 探索12款免费VSCode AI代码提示插件:Codeium、Codegeex、CodeFuse、TONGYI Lingma、Comate、iFlyCode、Fitten Code、Bito AI、Mintlify Doc Writer、Kodezi AI、aiXcoder、IntelliCode。这些插件提供智能补全、代码生成、注释、优化,支持多种语言,提升编程效率!🚀👩‍💻👨‍💻
16388 0

热门文章

最新文章