我有一个名为AAA
的表格,其中包含一列:
ED_RATE NOT NULL NUMBER(26,6)
我想用这句话来增加它的长度:
ALTER TABLE ioa_invoice_line MODIFY FIXED_RATE NUMBER(26,15)
现在执行此操作时,我收到错误,请告知我如何克服此错误
ORA-01440:要修改的列必须为空以降低精度或比例
- 00000 - 要修改的列必须为空以降低精度或比例
醇>
答案 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列的新精度。然后将所有数据从源表复制到新表,删除源表,然后将目标表重命名为源表。