提高Oracle中数字列的精度或比例

提高Oracle中数字列的精度或比例,oracle,Oracle,我有一个名为AAA的表,其中有一列: ED_RATE NOT NULL NUMBER(26,6) 我想使用以下语句增加其长度: ALTER TABLE ioa_invoice_line MODIFY FIXED_RATE NUMBER(26,15) 现在执行此操作时,我遇到了一个错误,请告知我如何克服此错误 ORA-01440:要修改的列必须为空,以降低精度或比例 00000-要修改的列必须为空,以降低精度或比例 在Oracle()中,不能降低数字列的精度。关于您的问题,有趣的是旧的精度

我有一个名为
AAA
的表,其中有一列:

ED_RATE NOT NULL NUMBER(26,6) 
我想使用以下语句增加其长度:

ALTER TABLE ioa_invoice_line MODIFY FIXED_RATE NUMBER(26,15) 
现在执行此操作时,我遇到了一个错误,请告知我如何克服此错误

ORA-01440:要修改的列必须为空,以降低精度或比例

  • 00000-要修改的列必须为空,以降低精度或比例

  • 在Oracle()中,不能降低数字列的精度。关于您的问题,有趣的是旧的精度是
    NUMBER(26,6)
    ,而新的所需精度是
    NUMBER(26,15)
    。这使得乍一看,两列的总精度都是相同的26位。我相信这可能是你困惑的根源。但是,第一种情况的精度为6位小数,而第二种情况的精度为15位。向列中添加的9位精度可能会以小数点左边的精度为代价。因此,这可能会导致某些数据被截断

    如果你想增加9位数的十进制精度,我相信你还必须增加总精度。因此,应采取以下措施:

    ALTER TABLE ioa_invoice_line MODIFY FIXED_RATE NUMBER(35,15)
                                                          ^^ ^^ add 9 to both
    
    请注意,精度限制为38,您的需要在该限制内。

    数字(26,6)表示26位数字,其中小数点后6位,整数部分保留20位。数字(26,15)的意思是——好吧,你可以猜出来。这只剩下11位整数部分-导致与现有数据的潜在冲突


    您可能需要数字(35,15)。

    您需要从源表创建具有结构的新表,但具有列ED_DATE的新精度。然后将源表中的所有数据复制到新表中,删除源表,然后将目标表重命名为源表。

    您可以重命名目标表,然后创建新列,在其中复制所有值并删除旧列:

    alter table ioa_invoice_line rename column ED_RATE to ED_RATE_TMP;
    alter table ioa_invoice_line add ED_RATE NOT NULL NUMBER(26,15);
    update ioa_invoice_line set ED_RATE=ED_RATE_TMP;
    alter table ioa_invoice_line drop column ED_RATE_TMP;
    execute utl_recomp.recomp_serial();
    
    另一种方法是将值移动到临时列中,然后增加ED_RATE的长度并将值移回:

    alter table ioa_invoice_line add ED_RATE_TMP NUMBER(26,6);
    alter table ioa_invoice_line modify column ED_RATE null;
    update ioa_invoice_line set ED_RATE_TMP=ED_RATE, ED_RATE=null;
    alter table ioa_invoice_line modify column ED_RATE NUMBER(26,15);
    update ioa_invoice_line set ED_RATE=ED_RATE_TMP;
    alter table ioa_invoice_line modify column ED_RATE not null;
    alter table ioa_invoice_line drop column ED_RATE_TMP;
    execute utl_recomp.recomp_serial();