Почему при попытке изменить столбец с VARCHAR2 (200) на VARCHAR2 (1000) появляется «ORA-01429: таблица с индексами»? - PullRequest
4 голосов
/ 26 апреля 2011

В настоящее время это VARCHAR2(200) в базе данных, но его нужно повысить до VARCHAR(1000), поэтому я пытаюсь запустить этот скрипт:

ALTER TABLE CONTRACTOR MODIFY
(
    NOTE VARCHAR2(1000)
);

Oracle дает мне это:

ORA-01429: организованная по индексу таблица: нет сегмента данных для хранения переполненных частей строки

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

Ответы [ 2 ]

12 голосов
/ 26 апреля 2011

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

Рассмотрим (10.2.0.3 - 8k блоков):

SQL> CREATE TABLE contractor (
  2     ID NUMBER PRIMARY KEY,
  3     data_1 CHAR(1000),
  4     data_2 CHAR(1000),
  5     data_3 CHAR(1000),
  6     data_4 CHAR(1000),
  7     data_5 CHAR(1000),
  8     NOTE VARCHAR2(200)
  9  ) 
 10  ORGANIZATION INDEX;

ORA-01429: Index-Organized Table: no data segment to store overflow row-pieces

Однако при указании сегмента переполнения:

SQL> CREATE TABLE contractor (
  2     ID NUMBER PRIMARY KEY,
  3     data_1 CHAR(1000),
  4     data_2 CHAR(1000),
  5     data_3 CHAR(1000),
  6     data_4 CHAR(1000),
  7     data_5 CHAR(1000),
  8     NOTE VARCHAR2(200)
  9  )
 10  ORGANIZATION INDEX 
 11  OVERFLOW TABLESPACE USER_DATA;

Table created
0 голосов
/ 29 января 2016

Я наткнулся на эту страницу с высоким рейтингом, когда гуглил «ORA-01429».Я также столкнулся с тем же исключением, когда пытался разделить раздел OVERFLOW в таблице Oracle 11G.

*Incorrect*:
alter table sales SPLIT PARTITION OVERFLOW at (TO_DATE('01-FEB-2017 00:00:00', 'DD-MON-YYYY HH24:MI:SS')) 
  INTO (PARTITION sales_m01_2017, PARTITION OVERFLOW);

*Fixed*:
alter table sales SPLIT PARTITION OVERFLOW at (TO_DATE('01-FEB-2017 00:00:00', 'DD-MON-YYYY HH24:MI:SS')) 
  INTO (PARTITION sales_m01_2017, PARTITION "OVERFLOW");

Я получил исправление для моей проблемы по следующему адресу: https://community.oracle.com/thread/2244949?tstart=0

OVERFLOW должен быть заключен в двойные кавычки, как "OVERFLOW".Я хотел бы поделиться этим здесь в интересах других поклонников стекового потока, сталкивающихся с тем же исключением ORA при разделении раздела OVERFLOW.

...