Несовместимые типы данных в Oracle - PullRequest
1 голос
/ 18 августа 2010

У меня есть следующая функция:

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 Ответ

6 голосов
/ 18 августа 2010

Ваша функция работает.

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 и вместо этого суммировать их.

...