如何在 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 从创建表脚本中忽略创建分段脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle利用dbms_metadata.get_ddl查看DDL语句

Oracle获取数据库中的对象创建语句

如何获得在Oracle中创建表时使用的查询?

如何根据现有模式在 Oracle 中编写表结构?

ORACLE不使用工具的情况下获取对象DDL

oracle中查询用户表/索引/视图创建语句