oracle – 如何使dbms_metadata.get_ddl更漂亮有用

oracle – 如何使dbms_metadata.get_ddl更漂亮有用,第1张

概述我正在创建一个包以在我的架构中生成对象的DDL(您解析对象名称,并使用DDL返回一个clob),因此我可以生成文件,并将它们直接放入SVN. 我使用dbms_metadata.get_ddl,它除了表/物化视图之外的所有对象都很好用. 如果我创建一个表: create table stackoverflow ( col_1 varchar2(64) , col_2 number 我正在创建一个包以在我的架构中生成对象的DDL(您解析对象名称,并使用DDL返回一个clob),因此我可以生成文件,并将它们直接放入SVN.

我使用dbms_Metadata.get_ddl,它除了表/物化视图之外的所有对象都很好用.

如果我创建一个表:

create table stackoverflow     ( col_1 varchar2(64),col_2 number,col_3 date);create index IDx_test on stackoverflow(col_1);alter table stackoverflow add constraint ui_test unique (col_2) using index;

并生成DDL:

begin   dbms_output.put_line(dbms_Metadata.get_ddl( object_type => 'table',name => 'STACKOVERFLOW')                        );end;

它给了我们:

CREATE table "TEST_SCHEMA"."STACKOVERFLOW"  (  "Col_1" VARCHAR2(64),"Col_2" NUMBER,"Col_3" DATE,CONSTRAINT "UI_TEST" UNIQUE ("Col_2")USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COmpuTE STATISTICS STORAGE(INITIAL 131072 NEXT 131072 mineXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREEListS 1 FREEList GROUPS 1BUFFER_POol DEFAulT FLASH_CACHE DEFAulT CELL_FLASH_CACHE DEFAulT)tableSPACE "USERS_DATA_TS"  ENABLE ) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGINGSTORAGE(INITIAL 131072 NEXT 131072 mineXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREEListS 1 FREEList GROUPS 1BUFFER_POol DEFAulT FLASH_CACHE DEFAulT CELL_FLASH_CACHE DEFAulT)tableSPACE "USERS_DATA_TS"

要采取所有相关索引,我们可以使用:

begin   dbms_output.put_line(dbms_Metadata.get_dependent_ddl( object_type => 'INDEX',base_object_name => 'STACKOVERFLOW'));end;

具有:

CREATE INDEX "TEST_SCHEMA"."IDX_TEST" ON "MF"."STACKOVERFLOW" ("Col_1") PCTFREE 10 INITRANS 2 MAXTRANS 255 COmpuTE STATISTICS STORAGE(INITIAL 131072 NEXT 131072 mineXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREEListS 1 FREEList GROUPS 1BUFFER_POol DEFAulT FLASH_CACHE DEFAulT CELL_FLASH_CACHE DEFAulT)tableSPACE "USERS_DATA_TS" CREATE UNIQUE INDEX "TEST_SCHEMA"."UI_TEST" ON "MF"."STACKOVERFLOW" ("Col_2") PCTFREE 10 INITRANS 2 MAXTRANS 255 COmpuTE STATISTICS STORAGE(INITIAL 131072 NEXT 131072 mineXTENTS 1 MAXEXTENTS 2147483645PCTINCREASE 0 FREEListS 1 FREEList GROUPS 1BUFFER_POol DEFAulT FLASH_CACHE DEFAulT CELL_FLASH_CACHE DEFAulT)tableSPACE "USERS_DATA_TS"

我想创建一个文件,其中包含:create table,constraints,indexes,grant(要有一个需要所有定义的文件),并且使用dbms_Metadata我看起来不可能做到这一点.

我的输出问题是:

>双引号的名称
> DDL中的模式名称使得我们很难在许多模式中编译相同的DDL.要解决这个问题,我们需要为正则表达式创建一些或者添加如下的代码:

dbms_Metadata.SET_REMAP_ParaM(dbms_Metadata.SESSION_transform,'REMAP_SCHEMA','TEST_SCHEMA','');

但是你必须添加8行以上:

hOpenorig0 := DBMS_MetaDATA.OPEN('table');DBMS_MetaDATA.SET_FILTER(hOpenorig0,'name',p_object_name);DBMS_MetaDATA.SET_FILTER(hOpenorig0,'SCHEMA',get_table.owner);tr := dbms_Metadata.add_transform(hOpenorig0,'MODIFY');hTransDDL := DBMS_MetaDATA.ADD_transform(hOpenorig0,'DDL');dbms_Metadata.set_remap_param(tr,name => 'REMAP_SCHEMA',old_value => user,new_value => '');get_package_spec.ddl := DBMS_MetaDATA.FETCH_CLOB(hOpenorig0);DBMS_MetaDATA.CLOSE(hOpenorig0);

>没有办法在同一时刻提取约束(使用索引)和索引.由于ui_test的重复定义,您不能连接输出.是的,可以从get_ddl中删除约束,但是我们正在放弃约束/检查.
> PL / sql Developer如何创建输出

-- Create tablecreate table STACKOVERFLOW(  col_1 VARCHAR2(64),col_2 NUMBER,col_3 DATE)tablespace USERS_DATA_TS  pctfree 10  pctused 40  initrans 1  maxtrans 255  storage  (    initial 128K    next 128K    minextents 1    maxextents unlimited    pctincrease 0  );-- Create/Recreate indexes create index IDX_TEST on STACKOVERFLOW (Col_1)  tablespace USERS_DATA_TS  pctfree 10  initrans 2  maxtrans 255  storage  (    initial 128K    next 128K    minextents 1    maxextents unlimited    pctincrease 0  );-- Create/Recreate primary,unique and foreign key constraints alter table STACKOVERFLOW  add constraint UI_TEST unique (Col_2)  using index   tablespace USERS_DATA_TS  pctfree 10  initrans 2  maxtrans 255  storage  (    initial 128K    next 128K    minextents 1    maxextents unlimited    pctincrease 0  );

有没有人知道如何创建与PL / sql Developer类似的输出?我猜他们创建了一些dbms_Metadata.get_xml的XML解析器)来创建一个更漂亮的版本(缩进,排序,一切都好,可以随时编译).

当然,我可以使用正则表达式或user_indexes,但这不是重点.

PS. DBMS_MetaDATA.SET_transform_ParaM(DBMS_MetaDATA.SESSION_transform,‘漂亮’,TRUE);是一个奇怪的定义是什么是“漂亮”.

dbms_Metadata.get_dll将oracle对象作为xml,并将其由xslt转换为ddl脚本.

有用表的列表从all_tables中选择table_name,其中table_name如“Meta%”.

> MetaSTYLESHEET – 将样式表映射到其名称
> MetaXSL $ – 将XMLTAG映射到样式表名称 – 将其链接到第1个表
> MetaVIEW $ – 将对象类型映射到XMLTAG – 将其链接到第二个表
> MetaXSLParaM $ – 可用于每个对象类型和转换类型的变换过滤器的查找表.

对于表oracle使用kutable for xml to ddl for a index oracle using kuindex … etc.

通过设置参数可以改变转换的行为.要找到有用的参数检查MetaXSLParaM $table或在样式表文档中搜索.
EMIT_SCHEMA – 我在kucommon xslt中找到

EXECUTE DBMS_MetaDATA.SET_transform_ParaM(DBMS_MetaDATA.SESSION_transform,'EMIT_SCHEMA',false);  --undocumented remove schemaEXECUTE DBMS_MetaDATA.SET_transform_ParaM(DBMS_MetaDATA.SESSION_transform,'SEGMENT_CREATION',false);  --undocumented remove segement creationEXECUTE DBMS_MetaDATA.SET_transform_ParaM(DBMS_MetaDATA.SESSION_transform,'CONSTRAINTS_AS_ALTER',true);select dbms_Metadata.get_ddl( object_type => 'table',name => 'STACKOVERFLOW') from dual;
总结

以上是内存溢出为你收集整理的oracle – 如何使dbms_metadata.get_ddl更漂亮/有用全部内容,希望文章能够帮你解决oracle – 如何使dbms_metadata.get_ddl更漂亮/有用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1167476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存