Oracle中的数据类型不一致

时间:2010-08-18 09:28:36

标签: oracle plsql ora-00932

我有以下功能:

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)
);

1 个答案:

答案 0 :(得分:6)

你的功能有效。

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数据量的确切范围,我建议您将LONGs卸载到CLOB列并将其汇总。