Подтвердить что ты не робот

Изменение точности числового столбца в Oracle

В настоящее время у меня есть столбец, объявленный как НОМЕР. Я хочу изменить точность столбца на NUMBER (14,2).

SO, я выполнил команду

 alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)'

для которого я получил сообщение об ошибке:

   column to be modified must be empty to decrease precision or scale

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

4b9b3361

Ответ 1

Предполагая, что вы не задали точность изначально, она считается максимальной (38). Вы уменьшаете точность, потому что вы меняете ее с 38 до 14.

Самый простой способ справиться с этим - переименовать столбец, скопировать данные и затем удалить исходный столбец:

alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD;

alter table EVAPP_FEES add AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_OLD;

alter table EVAPP_FEES drop column AMOUNT_OLD;

Если вы действительно хотите сохранить порядок столбцов, вы можете переместить данные дважды:

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;

update EVAPP_FEES set AMOUNT = null;

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;

alter table EVAPP_FEES drop column AMOUNT_TEMP;

Ответ 2

Установив масштаб, вы уменьшите точность. Попробуйте NUMBER (16,2).

Ответ 3

Если таблица сжата, это будет работать:

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2);

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT;

update EVAPP_FEES set AMOUNT = null;

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2);

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP;

alter table EVAPP_FEES move nocompress;

alter table EVAPP_FEES drop column AMOUNT_TEMP;

alter table EVAPP_FEES compress;