現在、NUMBERとして宣言されている列があります。列の精度を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
精度を変更しながら列を空にしたいのですが、列のデータが失われることはないので、列を増やしているときに列を小さくしたい理由がわかりません。これに対する短い回避策はありますか?転送とドロップの間にデータを失うリスクがあるため、別のテーブルにコピーして後でドロップしたり、列の名前を変更して列間でコピーしたりしたくない。
最初に精度を設定しなかったと仮定すると、それは最大(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;
列の順序を本当に維持したい場合は、代わりにデータを2回移動できます。
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;
スケールを設定すると、精度が低下します。 NUMBER(16,2)を試してください。
テーブルが圧縮されている場合、これは機能します:
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;