使用DBMS_METADATA.GET_DDL获取原始分区子句

时间:2018-07-03 10:18:20

标签: oracle

我在Oracle中使用以下方法创建了一个表

CREATE TABLE schema.table_name
(
   col_1                 NUMBER(15),
   col_2                 NUMBER(10),
   col_3                 NUMBER(10),
   col_4                 NUMBER,

)
PARTITION BY HASH (col_1) PARTITIONS 32;

但是,当我获取以下内容时:

select  DBMS_METADATA.GET_DDL('TABLE', table_name, owner) ddl
                , table_name 
             from all_tables 
            where owner = 'schema'
              and table_name = 'table_name';

我得到:

CREATE TABLE schema.table_name
(
   col_1                 NUMBER(15),
   col_2                 NUMBER(10),
   col_3                 NUMBER(10),
   col_4                 NUMBER,

)
NOLOGGING
PARTITION BY HASH (col_1)
 (PARTITION "SYS_P1" , 
  PARTITION "SYS_P2" , 
  PARTITION "SYS_P3" , 
  PARTITION "SYS_P4" , 
  PARTITION "SYS_P5" ,
  ....
  PARTITION "SYS_P32");

我尝试了所有这些参数:

DBMS_METADATA.SET_TRANSFORM_PARAM(
    DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',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,'SQLTERMINATOR',true);     
DBMS_METADATA.SET_TRANSFORM_PARAM(
    DBMS_METADATA.SESSION_TRANSFORM,'PRETTY',true)

是否可以将DDL恢复为原始格式?

2 个答案:

答案 0 :(得分:3)

否,您无法重新获得用于创建表/索引/外键/任何内容的初始语句。

oracle在这里提供的DDL语句是一个DDL语句,用于产生与当前存在的结果完全相同的结果。在您的情况下,这会产生非常短的结果,因为当我尝试使用表时,它还会提到存储,并行,表空间,buffer_pool等。

因此,...PARTITION BY HASH (col_1) (PARTITION "SYS_P1" , .... PARTITION "SYS_P32");...可能会产生与...PARTITION BY HASH (col_1) PARTITIONS 32;...不同的结果。这里的一个例子是use another tablespace或compress选项。

如果数据库的某些默认选项发生了变化,而您仍想重新获得之前的确切表,该怎么办?创建表时,未对其进行压缩。现在,如果它是您前一段时间使用的相同语句的当前默认值。

TL; DR

答案:

原因:您无法使用创建时给出的几个选项来复制完全相同的对象,所有其他未给出的选项都是从数据库的默认设置中获取的。这些可能会随时间变化。

答案 1 :(得分:0)

您可以使用regexp_replace函数消除那些不必要的分区详细信息。我使用以下代码:

mystr := regexp_replace ( regexp_replace ( mystr, ' \(*PARTITION [^(BY)](.|[:cntrl:])+', null, 1, 0, 'm'), '^[[:cntrl:][:cntrl:]]+$', null, 1, 0, 'm');

说明:首先,它消除了所有以“ PARTITION”开头的行,除了以“ PARTITION BY”开头的内容,然后消除了第一个“掩码”所导致的空行。