Pat*_*icz 13 oracle ddl plsqldeveloper dbms-metadata
我正在创建一个包来生成我的模式中的对象的DDL(您解析对象名称,并返回一个clobDDL),所以我可以生成文件,并将它们直接放入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;
Run Code Online (Sandbox Code Playgroud)
并生成DDL:
begin
dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE'
, name => 'STACKOVERFLOW')
);
end;
Run Code Online (Sandbox Code Playgroud)
它给了我们:
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"
Run Code Online (Sandbox Code Playgroud)
要获取所有相关索引,我们可以使用:
begin
dbms_output.put_line(dbms_metadata.get_dependent_ddl( object_type => 'INDEX'
, base_object_name => 'STACKOVERFLOW'));
end;
Run Code Online (Sandbox Code Playgroud)
具有:
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"
Run Code Online (Sandbox Code Playgroud)
我想创建一个文件,其中包含:创建表,约束,索引,授权(要有一个文件,需要所有定义),使用dbms_metadata它看起来不可能.
我的输出问题是:
双引号的名称
DDL中的模式名称使我们很难跨多个模式编译相同的DDL.要解决这个问题,我们需要为正则表达式创建一些或者添加类似下面的内容可以解决这个问题:
dbms_metadata.SET_REMAP_PARAM(dbms_metadata.SESSION_TRANSFORM,'REMAP_SCHEMA','TEST_SCHEMA','');
Run Code Online (Sandbox Code Playgroud)
但你必须添加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);
Run Code Online (Sandbox Code Playgroud)无法在同一时刻提取约束(使用索引)和索引.由于重复定义,您无法连接输出ui_test.是的,可以选择删除约束,get_ddl但我们正在放弃约束/检查.
PL/SQL Developer如何创建输出
-- 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
);
Run Code Online (Sandbox Code Playgroud)有没有人知道创建类似于PL/SQL Developer的输出的方法?我猜他们创建了一些XML解析器dbms_metadata.get_xml来创建一个更漂亮的版本(缩进,顺序,所有在适当的位置,随时可以编译).
当然我可以玩正则表达式,user_indexes但这不是重点.
PS.DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true);什么是"漂亮"是一个奇怪的定义.
dbms_metadata.get_dll将oracle对象作为xml获取,然后通过xslt将其转换为ddl脚本.
有用的表列表select table_name from all_tables where table_name like 'META%'.
METASTYLESHEET - 将样式表映射到它的名称
METAXSL $ - 将XMLTAG映射到样式表名称 - 将其链接到第1个表
对于表oracle使用kutable for xml to ddl for a index oracle使用kuindex ...等.
通过设置参数,您可以更改转换行为.要找到有用的参数检查METAXSLPARAM $表或在样式表文档中搜索它.EMIT_SCHEMA - 我在kucommon xslt中找到了
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;
Run Code Online (Sandbox Code Playgroud)
fat*_*ihn -2
我可以建议您使用 expdp / impdp 进行 ddl 导出。
导出架构:faydin使用以下 expdp。
expdp userid=faydin/***** directory=ORA_TMP_DIR reuse_dumpfiles=y content=METADATA_ONLY exclude=STATISTICS schemas=faydin dumpfile=metadata.dmp
ddl.sql使用 user : faydin remapped as: faydin3impdp获取 ddl
impdp userid=faydin/***** directory=ORA_TMP_DIR dumpfile=metadata.dmp sqlfile=ddl.sql remap_schema=faydin:faydin3
通过删除sqlfile=ddl.sqlimpdp 命令中的短语将模式导入到数据库。
| 归档时间: |
|
| 查看次数: |
5635 次 |
| 最近记录: |