我有以下功能:
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)
);
答案 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列并将其汇总。