Rad*_*mir 1 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;
Run Code Online (Sandbox Code Playgroud)
以及更新:
update ANINTEGDATA set val1=to_char(nvl(MXUPGKEYVAL(MX5T,MX5C),0)) where type=1;
Run Code Online (Sandbox Code Playgroud)
当我执行更新时,我得到:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
ORA-06512: at "MAXIMO.MXUPGKEYVAL", line 6
ORA-06512: at line 2
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?
此致,Radu.
稍后编辑:
表ANINTEGDATA是:
create table ANINTEGDATA
(
MX5T VARCHAR2(50),
MX5C VARCHAR2(50),
MX6T VARCHAR2(50),
MX6C VARCHAR2(50),
TYPE NUMBER,
VAL1 VARCHAR2(200),
VAL2 VARCHAR2(200)
);
Run Code Online (Sandbox Code Playgroud)
你的功能有效.
SQL> select mxupgkeyval('EMP', 'SAL') from dual
2 /
MXUPGKEYVAL('EMP','SAL')
------------------------
78
SQL>
Run Code Online (Sandbox Code Playgroud)
此外,它适用于您的更新语句.
SQL> update ANINTEGDATA set val1=to_char(nvl(MXUPGKEYVAL(MX5T,MX5C),0)) where type=1;
1 row updated.
SQL>
Run Code Online (Sandbox Code Playgroud)
它不起作用的是当有问题的列具有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>
Run Code Online (Sandbox Code Playgroud)
这只是为什么LONG是Teh Suck的另一个原因!很久以前应该已经废除了.正如您正在进行数据迁移练习一样,现在是考虑转向非常灵活的CLOB数据类型的好时机.
无论哪种方式,您都需要一个约定来指示目标列包含大量数据.
如果你真的需要知道LONG数据量的确切范围,我建议你将LONGs卸载到CLOB列并将它们相加.