Изменить тип данных столбца в производственной базе данных - PullRequest
5 голосов
/ 05 сентября 2011

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

До сих пор моим решением является оператор PLSQL, который хранит данные столбца, подлежащего изменению в коллекции, изменяет таблицу, а затем выполняет итерацию по коллекции, восстанавливая исходные данные с преобразованным типом данных.

-- Before: my_table ( id NUMBER, my_value VARCHAR2(255))
-- After: my_table (id NUMBER, my_value NUMBER)

DECLARE
  TYPE record_type IS RECORD ( id NUMBER, my_value VARCHAR2(255));
  TYPE nested_type IS TABLE OF record_type;
  foo nested_type;
BEGIN
  SELECT id, my_value BULK COLLECT INTO foo FROM my_table;
  UPDATE my_table SET my_value = NULL;
  EXECUTE IMMEDIATE 'ALTER TABLE my_table MODIFY my_value NUMBER';
  FOR i IN foo.FIRST .. foo.LAST
  LOOP
    UPDATE my_table 
        SET  = TO_NUMBER(foo(i).my_value) 
        WHERE my_table.id = foo(i).id;
  END LOOP;
END;
/

Я ищу более опытный способ сделать это.

Ответы [ 2 ]

6 голосов
/ 05 сентября 2011

Решение неверное.Оператор alter table выполняет неявную фиксацию.Таким образом, решение имеет следующие проблемы:

  • Невозможно выполнить откат после оператора alter table, и если сбой базы данных после оператора alter table, вы потеряете данные
  • Между select ипользователи обновления могут вносить изменения в данные

Вместо этого вам следует взглянуть на переопределение Oracle в режиме онлайн.

5 голосов
/ 06 сентября 2011

Ваше решение выглядит немного опасным для меня. Загрузка значений в коллекцию и последующее удаление их из таблицы означает, что эти значения теперь доступны только в памяти. Если что-то идет не так, они теряются.

Правильная процедура:

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