2012-02-20 64 views
1

我們試圖修改數據庫中現有列的精度。那些已被定義爲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 

編輯:我知道截斷錯誤地使用這個詞,但我不知道一個更好的詞以削減精度。

+3

什麼ROUND()? – rkosegi 2012-02-20 17:24:48

+1

[截斷](http://en.wikipedia.org/wiki/Truncate)與[舍入](http://en.wikipedia.org/wiki/Rounding)不同。問題中給出的示例指示截斷,但接受的答案是四捨五入。 – user272735 2012-02-20 18:02:38

回答

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 
2

如何使用ROUND (number)

+0

如何更改整個色譜柱?更新table_name設置列=圓(列)? – roymustang86 2012-02-20 17:28:30

+0

是的,正好:update table_name set column = round(column,[decimas])。 – CristiC 2012-02-20 17:29:21

+0

作爲測試,在更新之前,您可以嘗試:選擇列作爲Before_Rounding,將round(列)作爲After_Rounding from table_name; – CristiC 2012-02-20 17:30:43