oracle – 如何使dbms_metadata.get_ddl更漂亮/有用
我正在创建一个包以在我的架构中生成对象的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 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_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 LOGGING STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_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 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_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 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE "USERS_DATA_TS" 我想创建一个文件,其中包含:create table,constraints,indexes,grant(要有一个需要所有定义的文件),并且使用dbms_metadata我看起来不可能做到这一点. 我的输出问题是: >双引号的名称 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中删除约束,但是我们正在放弃约束/检查. -- Create table create 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 – 将样式表映射到其名称 对于表oracle使用kutable for xml to ddl for a index oracle using kuindex … etc. 通过设置参数可以改变转换的行为.要找到有用的参数检查METAXSLPARAM $table或在样式表文档中搜索. EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'EMIT_SCHEMA',false); --undocumented remove schema EXECUTE DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_CREATION',false); --undocumented remove segement creation EXECUTE 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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |