在插入数据库之前截断值

时间:2012-02-20 17:21:01

标签: oracle plsql precision

我们正在尝试修改数据库中现有列的精度。那些被定义为NUMBER的,我们想将它改为NUMBER(14,2)。

但是,由于NUMBER的默认精度为38,因此数据库中存在的值超过10个小数位。因此,当我们创建一个额外的列并尝试从临时表中复制时,这会导致错误。

 select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_INTERFACE' and COLUMN_NAME = 'RESERVE_RATE_NUM' and DATA_SCALE is null; 
 IF (countCol <> 0) then   

 execute immediate 'alter table EVAPP_INTERFACE add RESERVE_RATE_NUM_TMP NUMBER(6,3)' ; 

 execute immediate 'update EVAPP_INTERFACE set RESERVE_RATE_NUM_TMP = RESERVE_RATE_NUM' ; 

 execute immediate 'alter table EVAPP_INTERFACE drop column RESERVE_RATE_NUM' ; 

 execute immediate 'alter table EVAPP_INTERFACE rename column RESERVE_RATE_NUM_TMP to RESERVE_RATE_NUM' ; 


 DBMS_OUTPUT.put_line('This column EVAPP_INTERFACE.RESERVE_RATE_NUM has been modified to the required precision');

有没有办法截断列中的所有值?

比如说列有

43.8052201822
21.1610909091
76.4761223618
75.8535613657

我希望他们全部改为

 43.8
 21.16
 76.47
 75.85
编辑:我知道Truncate这个词被错误地使用了,但我不知道一个更好的术语来削减精确度。

2 个答案:

答案 0 :(得分:3)

根本不是一个错误的词,请参阅:TRUNC(number)

从下面的示例中,您可以看到截断和舍入的区别:

create table foo(n number);

insert all
into foo values (1.111)
into foo values (5.555)
into foo values (9.999)
select * from dual;

select n, round(n,2), trunc(n, 2) from foo;

         N ROUND(N,2) TRUNC(N,2)
---------- ---------- ----------
     1.111       1.11       1.11
     5.555       5.56       5.55
     9.999         10       9.99

答案 1 :(得分:2)

如何使用ROUND (number)