2014-02-22 36 views
0

我還沒有看到這個確切的問題......我很抱歉如果我錯過了它。更改Oracle中的號碼精度

我有一個數據庫,我從創建它的公司那裏繼承的數據庫,當他們失去了我的公司的合同。現在,客戶有一個「緊急」問題來改變價值的精確度。他們希望將數字從10.3更改爲10.8;該字段在數據庫中定義爲10,3。在我對這個問題的研究中,似乎我必須做相當多的操作才能做到這一點,因爲表格需要爲空來改變精度。我假定即使默認值是10.38(或其他),但是由於它們在創建時將其定義爲10,3,所以如果我只是增加ColdFusion代碼中的字段,那麼它在保存時會截斷爲10,3 ?這一變化將涉及我捕獲當前數據,刪除數據,更改精度,然後重新加載數據,確保現有數據也被更改。是的,我知道這不是詳細的,但希望得到重點。謝謝。

+2

請看這裏http://stackoverflow.com/questions/9233909/changing-precision-of-numeric-column-in-oracle。同樣的問題。 –

+0

很確定戴夫科斯塔是正確的,你想提高列的精度和規模;您可能需要查看[如何定義和限制數字](http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref119)。 –

回答

2

處理最簡單的方法是重命名列,數據拷貝過來,然後刪除原始列:

alter table EVAPP_FEES rename column AMOUNT to AMOUNT_OLD; 

alter table EVAPP_FEES add AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_OLD; 

alter table EVAPP_FEES drop column AMOUNT_OLD; 

OR

alter table EVAPP_FEES add AMOUNT_TEMP NUMBER(14,2); 

update EVAPP_FEES set AMOUNT_TEMP = AMOUNT; 

update EVAPP_FEES set AMOUNT = null; 

alter table EVAPP_FEES modify AMOUNT NUMBER(14,2); 

update EVAPP_FEES set AMOUNT = AMOUNT_TEMP; 

alter table EVAPP_FEES drop column AMOUNT_TEMP; 
+0

[來自這裏的答案](http://stackoverflow.com/questions/9233909/changing-precision-of-numeric-column-in-oracle) – PHPnoob

3

你真的想從改變NUMBER(10,3)到NUMBER(10,8)?這將大大限制可以存儲在該字段中的數字範圍 - 這正是爲什麼當列中存在數據時你無法做到這一點。

或者你的意思是你想增加小數位數從3到8,同時仍然允許相同的值範圍?如果是這樣,那麼我認爲您想將NUMBER(10,3)更改爲NUMBER(15,8) - 即使列中包含數據,您也應該可以使用簡單的ALTER來完成此操作。

+0

是的,顧客在小數點後只需要8。我試圖解釋並被擊落。與此同時,具有更多最新技能的DBA將該字段更新爲NUMBER,但沒有指定大小。這解決了它。 –

+0

那麼...它允許我將ColdFusion更改爲小數點後8位。但是,當我嘗試保存它時,它將其舍入併爲之後的5添加零。 (即 - 123.12345678變成123.12300000)我錯過了什麼? –

+0

我開始認爲簡單的修復其他DBA所做的是什麼導致了我的問題。我是否需要明確宣佈10,8或15,8才能完成這項工作? –