Несовместимые типы данных в Oracle
У меня есть следующая функция:
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 ответ
Ваша функция работает.
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 - это Suck! и должен был быть уничтожен давным-давно. Поскольку сейчас вы выполняете упражнение по переносу данных, самое время подумать о переходе на очень гибкий тип данных CLOB.
В любом случае вам нужно соглашение, чтобы указать, что целевой столбец содержит поток данных.
Если вам действительно необходимо знать точную величину длинных томов данных, я предлагаю вам выгрузить LONG в столбцы CLOB и вместо этого суммировать их.