更改Oracle中数字列的精度

roy*_*g86 40 sql oracle precision

目前我有一个声明为NUMBER的列.我想将列的精度更改为NUMBER(14,2).

所以我跑了命令

 alter table EVAPP_FEES modify AMOUNT NUMBER(14,2)'
Run Code Online (Sandbox Code Playgroud)

为此,我收到了一个错误:

   column to be modified must be empty to decrease precision or scale
Run Code Online (Sandbox Code Playgroud)

我猜它希望列变为空而它改变了精度,我不知道为什么它说我们想减少它而我们增加它,列中的数据不能丢失.这有一个简短的解决方法吗?我不想将其复制到另一个表中并在之后删除它,或者重命名列并在列之间复制,因为存在丢失传输和丢弃之间数据的风险.

All*_*lan 74

假设您最初没有设置精度,则假定它是最大值(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;
Run Code Online (Sandbox Code Playgroud)

如果您确实要保留列排序,则可以将数据移动两次:

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;
Run Code Online (Sandbox Code Playgroud)

  • @BrownFurSeal:第一个解决方案将移动已更改的列,以使其成为表中的最后一列.第二种解决方案将保留列的原始顺序. (4认同)
  • @ArunGowda:在设置值的步骤之一中,您可以使用“TRUNC”或“CEIL”或“FLOOR”函数强制进行非标准舍入。IE `更新 EVAPP_FEES set AMOUNT_TEMP = TRUNC(AMOUNT, 2);` 始终向下舍入。 (2认同)