Ваша функция работает.
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, я предлагаю вам выгрузить LONG в столбцы CLOB и вместо этого суммировать их.