我们正在尝试修改数据库中现有列的精度。那些被定义为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这个词被错误地使用了,但我不知道一个更好的术语来削减精确度。
答案 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)?