提高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:要修改的列必须为空,以降低精度或比例
在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();