Получить оригинальное предложение разделения с DBMS_METADATA.GET_DDL - PullRequest
0 голосов
/ 03 июля 2018

Я создал таблицу в 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 в исходный формат?

1 Ответ

0 голосов
/ 03 июля 2018

Нет, вы не можете восстановить исходный оператор, который вы использовали для создания таблицы / индекса / внешнего ключа / чего бы то ни было.

Оракул оператора DDL, представленный здесь, является оператором DDL для получения точно такого же результата, какой он существует в настоящее время. В вашем случае это дает очень короткий результат, так как он также упоминает хранилище, параллелизм, табличное пространство, buffer_pool и т. Д., Когда я пытаюсь сделать это с моими таблицами.

Следовательно, ...PARTITION BY HASH (col_1) (PARTITION "SYS_P1" , .... PARTITION "SYS_P32");... может дать другой результат, чем ...PARTITION BY HASH (col_1) PARTITIONS 32;.... Примером здесь может быть использование другого табличного пространства или опция сжатия.

Что если некоторые параметры вашей базы данных по умолчанию изменятся, и вы все равно захотите восстановить ту таблицу, которая у вас была раньше? Когда вы создали таблицу, она не была сжата. Теперь это будет, если это текущее значение по умолчанию с тем же оператором, который вы использовали некоторое время назад.

TL; DR

Ответ: Нет

Почему: Невозможно воспроизвести точно такой же объект с несколькими опциями, указанными во время создания, все остальные, не указанные опции, берутся из настроек по умолчанию БД. Они могут измениться во времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...