Как изменить атрибут столбца, не влияя на уже существующие значения? - PullRequest
1 голос
/ 04 июня 2009

Короче говоря, я хочу сделать в колонке oracle db столбец varchar2 (16), который теперь называется varchar2 (8), не влияя на значения presnet. Я уже пробовал это, и это делает странные вещи.

Я попытался запросить: изменить таблицу, изменить SOME_TABLE (SOME_COL varchar2 (16)); Но значения (некоторые не все), уже присутствующие в таблице, получаются '\ 0' добавляется к ним, когда я запускаю вышеуказанный запрос.

Итак, как правильно делать то, что я хочу?

Ответы [ 4 ]

3 голосов
/ 04 июня 2009

Очень сомнительно, что исходные данные в таблице изменяются. Поскольку некоторые из ваших комментариев подразумевают, что вы используете инструменты и приложения, отличные от SQLPlus, для просмотра и обработки данных, я думаю, вам необходимо выяснить, неправильно ли они обрабатывают данные.

Вот пример, где я пытался воспроизвести то, что вы делали в прямом SQLPlus. Нулевые байты не добавляются к существующим данным:

SQL> create table foo (bar varchar2(8));

Table created.

SQL> insert into foo        
  2  select lpad(to_char(level),level)
  3    from dual 
  4    connect by level <=8;

8 rows created.

SQL> commit;

Commit complete.

SQL> select bar,dump(bar) from foo;

BAR
--------
DUMP(BAR)
--------------------------------------------------------------------------------
1
Typ=1 Len=1: 49

 2
Typ=1 Len=2: 32,50

  3
Typ=1 Len=3: 32,32,51

   4
Typ=1 Len=4: 32,32,32,52

    5
Typ=1 Len=5: 32,32,32,32,53

     6
Typ=1 Len=6: 32,32,32,32,32,54

      7
Typ=1 Len=7: 32,32,32,32,32,32,55

       8
Typ=1 Len=8: 32,32,32,32,32,32,32,56


8 rows selected.

SQL> alter table foo modify (bar varchar2(16));

Table altered.

SQL> select bar,dump(bar) from foo;

BAR
----------------
DUMP(BAR)
--------------------------------------------------------------------------------
1
Typ=1 Len=1: 49

 2
Typ=1 Len=2: 32,50

  3
Typ=1 Len=3: 32,32,51

   4
Typ=1 Len=4: 32,32,32,52

    5
Typ=1 Len=5: 32,32,32,32,53

     6
Typ=1 Len=6: 32,32,32,32,32,54

      7
Typ=1 Len=7: 32,32,32,32,32,32,55

       8
Typ=1 Len=8: 32,32,32,32,32,32,32,56
2 голосов
/ 04 июня 2009

Команда, которую вы выполняете, верна.

Вы уверены, что дополнительных символов, которые вы видите, еще нет?

0 голосов
/ 05 июня 2009

В основном согласен с Дейвом Костой. Может быть, есть кеш, который все еще думает, что данные имеют старый размер '8'. Когда вы говорите, что «некоторые не все» значения получают дополнительные \ 0, каков постоянный фактор? Они имеют одинаковую длину (например, семь или восемь символов) или могли быть вставлены во время выполнения столбца ALTER или до перезапуска какого-либо сервера?

Никаких решений, но что-то похожее возникло пару дней назад здесь . Может быть, попробуйте сравнить заметки.

0 голосов
/ 04 июня 2009

Если у вас больше ничего не работает, вы всегда можете сделать следующее:

  1. Добавить новый столбец с новым именем
  2. Скопируйте значения из старого столбца в новый, используя UPDATE
  3. Удалить старый столбец
  4. Переименуйте новый столбец в имя старого

Это длинная и громоздкая и грубая сила, но если вы не можете сделать это каким-либо другим способом, она будет работать ...

...