Добавить раздел в таблицу - PullRequest
       55

Добавить раздел в таблицу

0 голосов
/ 04 октября 2018

Я создал таблицу и пытаюсь добавить в нее раздел, но она завершается с ошибкой с неверным типом данных.

drop table test;
create table test (id number , h_date date);

ALTER TABLE TEST ADD  PARTITION BY RANGE ("h_date") INTERVAL(NUMTODSINTERVAL(1,'DAY'))
(PARTITION "P20120101"  VALUES LESS THAN (TO_DATE(' 2012-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')))                                                                                                            
PARALLEL 4                                                                                                              
PCTFREE 10;    

ошибка:

Error report -
SQL Error: ORA-00902: invalid datatype
00902. 00000 -  "invalid datatype"

Что-то здесь не так?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Как сказано в Barbaros, вы не можете добавить раздел в однораздельную таблицу.

Однако существует несколько способов преобразовать однораздельную таблицу в многораздельную таблицу.

  • Создать новую многораздельную таблицу, скопировать все данные из существующей таблицы в эту новую таблицу,брось старый.См. Ответ Барбароса, чтобы получить пример.
  • Используйте пакет DBMS_REDEFINITION .Это больше, чем просто одна команда, перейдите к документации, чтобы получить более подробную информацию, или задайте конкретный вопрос здесь, если он у вас есть.
  • В Oracle версии 12.2 функция Онлайн-преобразование не разделенных на частиТаблица с разделенной таблицей была представлена.С этой функцией это будет простая команда:

    ALTER TABLE test MODIFY
    PARTITION BY RANGE (h_date) INTERVAL (INTERVAL '1' DAY) (
        PARTITION P20120101 VALUES LESS THAN (DATE '2012-01-01')
    ) ONLINE;
    

Возможно, вы ищете Обмен разделами и подразделами .С помощью этой функции вы можете преобразовать однораздельную таблицу в раздел другой (многораздельной) таблицы или наоборот.

0 голосов
/ 05 октября 2018

Как отметил @Wernfried Domscheit, вам нужно переопределить ваш стол.Для существующей таблицы, заполненной данными, в качестве метода может использоваться ссылка на следующий блок:

SQL> create table test(id number , h_date date);     
Table created

SQL> insert all
  2         into test values(1,date'2011-12-31')
  3         into test values(1,date'2012-01-01')
  4         into test values(1,date'2012-01-02')
  5  select * from dual;     
3 rows inserted

SQL> select *
  2    from test;     
        ID H_DATE
---------- -----------
         1 31.12.2011
         1 01.01.2012
         1 02.01.2012

SQL> create table test2
  2    partition by range(h_date)
  3    interval
  4   (numtodsinterval(1,'day'))
  5   (partition "P20120101" values less than(to_date('2012-01-01 00:00:00', 
                             'yyyy-mm-dd hh24:mi:ss', 'NLS_CALENDAR=GREGORIAN')))
  6  as
  7  select * from test;     
Table created

SQL> select *
  2    from test2
  3     partition("P20120101");     
        ID H_DATE
---------- -----------
         1 31.12.2011

SQL> drop table test;
Table dropped

SQL> rename test2 to test;
Table renamed
...