【问题标题】:Assign LONG datatype column to a NUMBER data type column将 LONG 数据类型列分配给 NUMBER 数据类型列
【发布时间】:2012-08-24 04:38:37
【问题描述】:

我正在使用 Oracle 并且有一个包含 long 数据类型的表。从那以后我发现这是遗留问题,我应该使用 LOB。我现在也认为我可能只使用 NUMBER(10,0)。

我想将列从 long 数据类型转换为 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 列很长 新的 AMT2 列是我的新列 NUMBER(10, 0)

问题是在将 long 分配给数字时出现错误。这是在更新行 (line2) 我认为这是因为数据截断。

错误是

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

列中的所有数据都小于 10000,所以我想强制 oracle 忽略任何数据截断(因为我不认为应该有任何数据截断)。如何将长数据分配给数字数据列?

谢谢

【问题讨论】:

  • Oracle 中的LONG 数据类型用于存储大量文本数据。所以将其转换为NUMBER 似乎很奇怪。您是说不仅所有数据都是 4 个字节或更少,而且存储在 LONG 列中的字符都只是数字吗?此外,您声明您收到了一个错误,但您没有告诉我们这是什么错误。
  • 感谢贾斯汀。我已经添加了错误。对龙很感兴趣。我认为它就像 java 中的 long 一样,它是一个数字。此列仅包含数字

标签: sql oracle type-conversion


【解决方案1】:

创建一个 PL/SQL 函数以获取 Long 作为您需要的数据类型。

例子:

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

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2020-08-07
    • 1970-01-01
    • 2020-06-19
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多