我在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恢复为原始格式?
答案 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”开头的内容,然后消除了第一个“掩码”所导致的空行。