【问题标题】:Inconsistent datatypes in OracleOracle 中的数据类型不一致
【发布时间】:2010-08-18 09:28:36
【问题描述】:

我有以下功能:

create or replace
FUNCTION "MXUPGKEYVAL"(tbname varchar2,colname varchar2) return number is
val number;

BEGIN

EXECUTE IMMEDIATE
'select sum(length('||colname||')) from '||tbname into val;

return val;
END;

以及以下更新:

update ANINTEGDATA set val1=to_char(nvl(MXUPGKEYVAL(MX5T,MX5C),0)) where type=1;

当我执行更新时,我得到:

ORA-00932: inconsistent datatypes: expected NUMBER got LONG
ORA-06512: at "MAXIMO.MXUPGKEYVAL", line 6
ORA-06512: at line 2

知道为什么会这样吗?

问候, 拉杜。

后期编辑:

表 ANINTEGDATA 是:

create table ANINTEGDATA
(
  MX5T VARCHAR2(50),
  MX5C VARCHAR2(50),
  MX6T VARCHAR2(50),
  MX6C VARCHAR2(50),
  TYPE NUMBER,
  VAL1 VARCHAR2(200),
  VAL2 VARCHAR2(200)
);

【问题讨论】:

  • 您好 Radu,如果您不给我们一些示例数据和该表的列数据类型,我们无法给您正确答案:ANINTEGDATA(val1,type,MX5T,MX5C)
  • 嗨文森特。谢谢您的答复。我添加了 ANINTEGDATA 表的数据类型。该表现在包含 MX5T、MX5C 和类型字段的值。 MX5T 和 MX5C 字段包含同一架构上各种表的表名和列名。
  • MXUPGKEYVAL 的第一个参数显然应该是一个表名,在这个例子中这个参数被给出为'MX5T'(我相信这应该用引号括起来)。有 MX5T 表吗?这也是 ANINTEGDATA 上的列名。如果有 MX5T 表,您能否发布该表的定义?如果不是,请检查上面显示的函数定义是否是最新的。如上所示,我已经创建了 ANINTEGDATA 表和 MXUPGKEYVAL 函数,但出现的错误与您收到的错误不同。谢谢。

标签: oracle plsql ora-00932


【解决方案1】:

您的功能有效。

SQL> select mxupgkeyval('EMP', 'SAL') from dual
  2  /

MXUPGKEYVAL('EMP','SAL')
------------------------
                      78

SQL>

此外,它适用于您的更新语句。

SQL> update ANINTEGDATA set val1=to_char(nvl(MXUPGKEYVAL(MX5T,MX5C),0)) where type=1;

1 row updated.

SQL> 

当有问题的列具有 LONG 数据类型时,它不起作用。错误消息虽然不够清晰,但足够清晰。

SQL> alter table t34 add long_col long;

Table altered.

SQL> select mxupgkeyval('T34', 'LONG_COL') from dual
  2  /
select mxupgkeyval('T34', 'LONG_COL') from dual
       *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
ORA-06512: at "APC.MXUPGKEYVAL", line 6


SQL>

这只是 LONG 是 Teh Suck 的另一个原因!并且应该在很久以前就被取消了。当您正在进行数据迁移练习时,现在是考虑迁移到非常灵活的 CLOB 数据类型的好时机。

无论哪种方式,您都需要一个约定来指示目标列包含少量数据。

如果您确实需要知道 LONG 数据量的精确范围,我建议您将 LONG 卸载到 CLOB 列,然后将它们相加。

【讨论】:

  • 感谢您的回复。在新环境中,我们已经有了 clob 数据类型。问候,拉杜。
  • @RaduDragomir - 很好。我们可以像使用任何其他列一样使用 CLOB。它们比 LONG 少很多麻烦。
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 2021-12-09
  • 2015-12-26
  • 2014-05-31
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多