如何在 oracle 中使用 get_ddl 从创建表脚本中忽略创建分段脚本?
Posted
技术标签:
【中文标题】如何在 oracle 中使用 get_ddl 从创建表脚本中忽略创建分段脚本?【英文标题】:How can i ignore create portioned script from create table script using get_ddl in oracle? 【发布时间】:2019-08-14 07:08:07 【问题描述】:我正在开发一个 java 项目,我们正在使用 Oracle 12c
中的 get_ddl
方法创建表 ddl。
例如我的表名是 PARENT_EMP 和架构是 SECONDARYUSER 那么我使用 get_ddl 方法。
select dbms.get_ddl('TABLE','PARENT_EMP','SECONDARYUSER') from dual;
在执行上述语句之前,我正在执行以下脚本以忽略来自 ddl 的约束和表空间。
begin
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'STORAGE',false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'REF_CONSTRAINTS', false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'TABLESPACE',false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES', false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'CONSTRAINTS', false);
end;
但我的问题是,有些表有 REFERENCE PARTITIONED,如果我使用 get_ddl 方法获得 ddl,那么我也会获得外部约束脚本。
父表DDl是:-
create table parent_emp(
empno number primary key,
job varchar2(20),
sal number(7,2),
deptno number(2)
)
partition by list(job)
( partition p_job_dba values ('DBA'),
partition p_job_mgr values ('MGR'),
partition p_job_vp values ('VP')
);
子表 DDl 是:
CREATE TABLE "SECONDARYUSER"."REFERENCE_EMP"
(
"ENAME" VARCHAR2(10),
"EMP_ID" NUMBER,
"EMPNO" NUMBER,
CONSTRAINT "FK_EMPNO" FOREIGN KEY ("EMPNO")
REFERENCES "SECONDARYUSER"."PARENT_EMP" ("EMPNO") ENABLE
)
PARTITION BY REFERENCE ("FK_EMPNO")
(PARTITION "P_JOB_DBA" ,
PARTITION "P_JOB_MGR" ,
PARTITION "P_JOB_VP" ) "
请建议如何在不获取外部约束和分区 ddl 的情况下获取子表 ddl ,或者如何使用 alter table 在已创建的表上创建分区。
还有什么方法可以使用get_ddl
方法获得分区的ddl?
【问题讨论】:
子表ddl错了,请指正。 【参考方案1】:我刚刚找到了答案。
您缺少此声明:
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'PARTITIONING',false);
包含它,它会忽略带有'partition'的部分。
所以,你需要那些:
exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS',false);
exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',false);
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'PARTITIONING',false);
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'TABLESPACE',false);
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES', false);
致谢:this 的答案之一。
【讨论】:
我也在做同样的事情,但是如果表有引用分区,那么获取约束和分区脚本。如何忽略分区脚本。 谢谢你这个命令有效。执行此命令后,我得到没有分区的脚本,但外键脚本仍然进入脚本。CREATE TABLE "SECONDARYUSER"."REFERENCE_EMP" ( "ENAME" VARCHAR2(10), "EMP_ID" NUMBER, "EMPNO" NUMBER, CONSTRAINT "FK_EMPNO" FOREIGN KEY ("EMPNO") REFERENCES "SECONDARYUSER"."PARENT_EMP" ("EMPNO") ENABLE )
我刚刚又编辑了一遍。尝试再次执行,就像在我的帖子中一样,看看是否有效。
我已经使用了那个脚本,只是缺少 PARTITIONING,所以我已经添加到脚本中。以上是关于如何在 oracle 中使用 get_ddl 从创建表脚本中忽略创建分段脚本?的主要内容,如果未能解决你的问题,请参考以下文章