2012-02-20 17 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.8 
21.16 
76.47 
75.85 

EDITに変更したい列が

43.8052201822 
21.1610909091 
76.4761223618 
75.8535613657 

を持って言う:私は切り捨てが誤って使用されている単語を知っているが、私はより良い用語を知りません精度を剃る

+3

どうROUNDについて()?? – rkosegi

+1

[切り捨て](http://en.wikipedia.org/wiki/Truncate)は[丸め](http://en.wikipedia.org/wiki/Rounding)とは異なります。問題の例は切り捨てを示していますが、受け入れられる答えは四捨五入です。 – user272735

答えて

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

列全体でどのように変更できますか? update table_name set column =ラウンド(列)? – roymustang86

+0

はい、まさにupdate table_name set column = round(column、[decimas])です。 – CristiC

+0

テストの前に、更新する前に次のことを試すことができます。Before_Roundingとして列を選択し、table_nameからAfter_Roundingとして丸めます(列)。 – CristiC

関連する問題