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

时间:2016-09-20 05:10:08

标签: oracle

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

ED_RATE NOT NULL NUMBER(26,6) 

我想用这句话来增加它的长度:

ALTER TABLE ioa_invoice_line MODIFY FIXED_RATE NUMBER(26,15) 

现在执行此操作时,我收到错误,请告知我如何克服此错误

  

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

     
      
  1. 00000 - 要修改的列必须为空以降低精度或比例
  2.   

4 个答案:

答案 0 :(得分:8)

您无法降低Oracle(Reference)中数字列的精度。您的问题的有趣之处在于旧的精度为NUMBER(26,6),新的期望精度为NUMBER(26,15)。这使得第一眼看上去两列的精度总数相同。我相信这可能是你困惑的根源。但是,第一种情况有6位小数的精度,而第二种情况有15位。将9位精度添加到列中可能会以小数点左侧的精度为代价。因此,这可能会导致您的某些数据被截断。

如果你想添加9位小数精度,我相信你必须增加总精度。因此,以下应该有效:

ALTER TABLE ioa_invoice_line MODIFY FIXED_RATE NUMBER(35,15)
                                                      ^^ ^^ add 9 to both

请注意,精度限制为38,您的需求在此限制范围内。

答案 1 :(得分:1)

NUMBER(26,6)表示26位数,其中6位为小数,剩余20位为整数部分。 NUMBER(26,15)表示 - 嗯,你可以搞清楚。只留下11位数的整数部分 - 导致与现有数据的潜在冲突。

你可能想要NUMBER(35,15)。

答案 2 :(得分:1)

您可以重命名它,然后创建新列,复制那里的所有值并删除旧列:

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();

答案 3 :(得分:0)

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