2012-08-29 138 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