5

我正在研究 java 项目,在该项目中我们get_ddl使用Oracle 12c.

例如,我的表名是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 吗?

4

1 回答 1

1

我刚刚找到了答案。

您缺少此声明:

exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'PARTITIONING',false);

包含它,它将忽略带有“分区”的部分。

所以,你需要那些:

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的答案之一。

于 2019-08-14T10:19:45.470 回答