web-dev-qa-db-ja.com

Oracleでの数値列の精度の変更

現在、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

精度を変更しながら列を空にしたいのですが、列のデータが失われることはないので、列を増やしているときに列を小さくしたい理由がわかりません。これに対する短い回避策はありますか?転送とドロップの間にデータを失うリスクがあるため、別のテーブルにコピーして後でドロップしたり、列の名前を変更して列間でコピーしたりしたくない。

37
roymustang86

最初に精度を設定しなかったと仮定すると、それは最大(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;
72
Allan

スケールを設定すると、精度が低下します。 NUMBER(16,2)を試してください。

1
ron tornambe

テーブルが圧縮されている場合、これは機能します:

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;
1
DJ Dev J