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

前端之家收集整理的这篇文章主要介绍了oracle – 如何使dbms_metadata.get_ddl更漂亮/有用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个包以在我的架构中生成对象的DDL(您解析对象名称,并使用DDL返回一个clob),因此我可以生成文件,并将它们直接放入SVN.

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

如果我创建一个表:

  1. create table stackoverflow
  2. ( col_1 varchar2(64),col_2 number,col_3 date);
  3.  
  4. create index idx_test on stackoverflow(col_1);
  5.  
  6. alter table stackoverflow add constraint ui_test unique (col_2) using index;

生成DDL:

  1. begin
  2. dbms_output.put_line(dbms_Metadata.get_ddl( object_type => 'TABLE',name => 'STACKOVERFLOW')
  3. );
  4. end;

它给了我们:

  1. CREATE TABLE "TEST_SCHEMA"."STACKOVERFLOW"
  2. ( "COL_1" VARCHAR2(64),"COL_2" NUMBER,"COL_3" DATE,CONSTRAINT "UI_TEST" UNIQUE ("COL_2")
  3. USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  4. STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
  5. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  6. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  7. TABLESPACE "USERS_DATA_TS" ENABLE
  8. ) SEGMENT CREATION IMMEDIATE
  9. PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
  10. NOCOMPRESS LOGGING
  11. STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
  12. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  13. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  14. TABLESPACE "USERS_DATA_TS"

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

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

具有:

  1. CREATE INDEX "TEST_SCHEMA"."IDX_TEST" ON "MF"."STACKOVERFLOW" ("COL_1")
  2. PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  3. STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
  4. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  5. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  6. TABLESPACE "USERS_DATA_TS"
  7. CREATE UNIQUE INDEX "TEST_SCHEMA"."UI_TEST" ON "MF"."STACKOVERFLOW" ("COL_2")
  8. PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  9. STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
  10. PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  11. BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  12. TABLESPACE "USERS_DATA_TS"

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

我的输出问题是:

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

  1. dbms_Metadata.SET_REMAP_PARAM(dbms_Metadata.SESSION_TRANSFORM,'REMAP_SCHEMA','TEST_SCHEMA','');

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

  1. hOpenOrig0 := DBMS_MetaDATA.OPEN('TABLE');
  2. DBMS_MetaDATA.SET_FILTER(hOpenOrig0,'NAME',p_object_name);
  3. DBMS_MetaDATA.SET_FILTER(hOpenOrig0,'SCHEMA',get_table.owner);
  4. tr := dbms_Metadata.add_transform(hOpenOrig0,'MODIFY');
  5. hTransDDL := DBMS_MetaDATA.ADD_TRANSFORM(hOpenOrig0,'DDL');
  6. dbms_Metadata.set_remap_param(tr,name => 'REMAP_SCHEMA',old_value => user,new_value => '');
  7. get_package_spec.ddl := DBMS_MetaDATA.FETCH_CLOB(hOpenOrig0);
  8. DBMS_MetaDATA.CLOSE(hOpenOrig0);

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

  1. -- Create table
  2. create table STACKOVERFLOW
  3. (
  4. col_1 VARCHAR2(64),col_2 NUMBER,col_3 DATE
  5. )
  6. tablespace USERS_DATA_TS
  7. pctfree 10
  8. pctused 40
  9. initrans 1
  10. maxtrans 255
  11. storage
  12. (
  13. initial 128K
  14. next 128K
  15. minextents 1
  16. maxextents unlimited
  17. pctincrease 0
  18. );
  19. -- Create/Recreate indexes
  20. create index IDX_TEST on STACKOVERFLOW (COL_1)
  21. tablespace USERS_DATA_TS
  22. pctfree 10
  23. initrans 2
  24. maxtrans 255
  25. storage
  26. (
  27. initial 128K
  28. next 128K
  29. minextents 1
  30. maxextents unlimited
  31. pctincrease 0
  32. );
  33. -- Create/Recreate primary,unique and foreign key constraints
  34. alter table STACKOVERFLOW
  35. add constraint UI_TEST unique (COL_2)
  36. using index
  37. tablespace USERS_DATA_TS
  38. pctfree 10
  39. initrans 2
  40. maxtrans 255
  41. storage
  42. (
  43. initial 128K
  44. next 128K
  45. minextents 1
  46. maxextents unlimited
  47. pctincrease 0
  48. );

有没有人知道如何创建与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中找到

  1. EXECUTE DBMS_MetaDATA.SET_TRANSFORM_PARAM(DBMS_MetaDATA.SESSION_TRANSFORM,'EMIT_SCHEMA',false); --undocumented remove schema
  2. EXECUTE DBMS_MetaDATA.SET_TRANSFORM_PARAM(DBMS_MetaDATA.SESSION_TRANSFORM,'SEGMENT_CREATION',false); --undocumented remove segement creation
  3. EXECUTE DBMS_MetaDATA.SET_TRANSFORM_PARAM(DBMS_MetaDATA.SESSION_TRANSFORM,'CONSTRAINTS_AS_ALTER',true);
  4. select dbms_Metadata.get_ddl( object_type => 'TABLE',name => 'STACKOVERFLOW') from dual;

猜你在找的Oracle相关文章