2012-08-29 233 views
1

我正在使用Oracle並且有一個包含長數據類型的表。自那以後,我發現這是遺留的,我應該使用LOB。我現在也想我可以使用NUMBER(10,0)。將LONG數據類型列分配到NUMBER數據類型列

我想將列從長數據類型轉換爲NUMBER數據類型。

這是我的SQL到目前爲止。

ALTER TABLE BUDGET ADD AMT2 NUMBER(10,0); 
UPDATE BUDGET SET AMT2 = AMT; 
ALTER TABLE BUDGET DROP COLUMN AMT; 
ALTER TABLE BUDGET RENAME COLUMN AMT2 TO AMT; 

的AMT列是LONG 新AMT2列是我的電話號碼的新列(10,0)

的問題是分配給長了一些,當我得到一個錯誤。這是在更新行(第2行)這我認爲是由於數據截斷。

的錯誤是

SQL Error: ORA-00932: inconsistent datatypes: expected NUMBER got LONG 

中的所有列的數據小於10000,所以我想迫使甲骨文忽略任何數據截斷(因爲我不認爲應該有任何)。我如何將長數據分配給數字數據列?

謝謝

+1

Oracle中的'LONG'數據類型用於存儲大量文本數據。所以把它轉換成「NUMBER」似乎很奇怪。你是否說過,不僅所有數據都是4個字節或更少,並且存儲在「LONG」列中的字符都只是數字?此外,你聲明你得到一個錯誤,但你不告訴我們是什麼錯誤。 –

+0

謝謝賈斯汀。我添加了錯誤。有趣的長。我認爲這是一個數字在java中很長。此列僅包含數字 – RNJ

+0

['LONG'數據類型文檔](http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements001.htm#sthref136)以供參考。 –

回答

4

創建一個PL/SQL函數來獲取您需要的數據類型的長整型。

例子:

create or replace 
function longtonumber(p_rowid in rowid) 
return number 
as 
     l_data long; 
begin 
    select remarks into l_data from cr_claimheader where rowid = p_rowid; 
     return to_number(substr(l_data, 1, 4000)); 
end; 

然後,所有你需要做的就是更新您的更新語句使用此功能: 更新AM1 = longtonumber(AMT2)...等。

我得到這個從askTom:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:839298816582

+0

感謝VikrantY。有效。我在更新行中使用了to_number(substr(....)) – RNJ