Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL грешка:ORA-14006:невалидно име на дял

Не можете да разделите съществуваща таблица по този начин. Това изявление променя дяла, който все още не е създаден. Не знам автоматичния начин за извършване на тази операция и не съм сигурен, че можете да я направите.

Въпреки че съм правил това нещо много пъти, но с ръчни стъпки. Направете следното, ако не можете да намерите автоматизирано решение:

  1. Създайте разделена таблица с име table_name_part с вашите клаузи и всички ваши предпочитания.
  2. Вмъкнете в тази разделена таблица всички редове от оригиналната таблица. Обърнете внимание на компресията. Ако имате някаква компресия на таблицата (базова или HCC), трябва да използвате + APPEND намек.
  3. Създайте в разделена таблица вашите ограничения и индекси от оригиналната таблица.
  4. Преименувайте таблиците и изтрийте оригиналната таблица. Не го изпускайте, докато не ги разчитате.

Видях, че вашата таблица има опция за автоматично създаване на дял, ако не съществува. (NUMTOYMINTERVAL(1,'MONTH')) Така че трябва да създадете вашата таблица само с първия дял. Предполагам, че тук имате много данни само за четене, така че няма да имате проблем с последователността вместо миналия месец. Вероятно има данни за четене и запис, така че трябва да сте по-внимателни с момента, в който искате да вмъкнете данни в нова таблица и да превключите таблици.

Надявам се да ви помогна. Доколкото знам, може да има пакет с име DBMS_REDEFINITION, който може да ви помогне с автоматизирана версия на моите стъпки. Ако се нуждаете от повече подробности или имате нужда от помощ относно моя метод, моля, не се колебайте.

АКТУАЛИЗАЦИЯ: От Oracle 12c R2 можете да конвертирате таблица от неразделена в разделена с вашия метод. Намерете връзка по-долу. Сега това е предизвикателство за мен и се опитвам да преобразувам, но мисля, че няма начин да направя това преобразуване онлайн в 12c R1.

https://oracle-base.com/articles/12c/online-conversion-of-a-non-partitioned-table-to-a-partitioned-table-12cr2

Решение

Намерих решение за теб. Тук ще имате всички мои стъпки, които изпълнявам, за да конвертирам таблица онлайн. :)

<предварителен код>1. Създайте обикновена таблица и я попълнете.CREATE TABLE SCOTT.tab_unpartitioned( id NUMBER, description VARCHAR2 ( 50), created_date DATE);INSERT INTO tab_unpartitioned SELECT LEVEL, 'Description for ' || НИВО, ADD_MONTHS (TO_DATE ('01-JAN-2017', 'DD-MON-YYYY'), -TRUNC (DBMS_RANDOM.VALUE (1, 4) - 1) * 12) ОТ ДВОЙНО СВЪРЗВАНЕ ПО НИВО <=10000;КОМИТ;2. Създайте разделена таблица със същата структура.--Ако сте на 11g, създайте таблица с команда CREATE TABLE, но с различно име. ex:tab_partitionedCREATE TABLE SCOTT.tab_partitioned( id NUMBER, description VARCHAR2 ( 50), created_date DATE)PARTITION BY RANGE (created_date)INTERVAL( NUMTOYMINTERVAL(1,'YEAR'))(PARTITION part_2015 STOJNOSTI LESS THAN (TO_DATE ( '01-JAN) -2016', 'DD-MON-YYYY' )), PARTITION part_2016 СТОЙНОСТИ ПО-МАЛКИ ОТ (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )), PARTITION part_2017 СТОЙНОСТИ ПО-МАЛКИ ОТ (TO_DATE ( '01 -JAN-2018', 'DD-MON-YYYY' )));-това е команда за промяна, която работи само в 12c.ALTER TABLE tab_partitioned МОДИФИЦИРАЙТЕ ДЯЛА ПО ДИАПАЗОН (created_date) (PARTITION part_2015 СТОЙНОСТИ ПО-МАЛКИ ОТ (TO_DATE ( ' 01-ЯНУ-2016', 'ДД-ПОН-ГГГГ' )), PARTITION part_2016 СТОЙНОСТИ ПО-МАЛКИ ОТ (TO_DATE ( '01-ЯНУ-2017', 'DD-MON-YYYY' )), PARTITION part_2017 СТОЙНОСТИ ПО-МАЛКИ ОТ (TO_DATE ( '01-ЯНУ-2018', 'ДД-ПОН-ГГГГ' )));3. Проверете дали таблицата може да бъде конвертирана. Тази процедура трябва да работи без грешка. Предпоставки:таблицата трябва да има УНИКАЛЕН ИНДЕКС и ограничение за първичен ключ.EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED');4. Изпълнете следните стъпки, както направих аз. EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED'); var num_errors varchar2(2000);EXEC DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED', 1,TRUE,TRUE,TRUE,FALSE,:NUM_ERRORS,FALSE);SQL> PRINT NUM_ERRORS -- Трябва да върне 0EXEC DBMS_REDEFINITION .SYNC_INTERIM_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');

В края на скрипта ще видите, че оригиналната таблица е разделена.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EF заявка към Oracle хвърля ORA-12704:несъответствие на набора от знаци

  2. Класът на JDBC драйвер не е намерен:oracle.jdbc.OracleDriver

  3. предаване на името на таблицата като параметър на plsql

  4. Преобразувайте неразделена таблица в разделена таблица с помощта на ОНЛАЙН в Oracle PL/SQL

  5. Oracle PL/SQL групово събиране с пример за изключения за запазване