1

私は次の機能を持っています:

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)
);
4

1 に答える 1

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がTehSuckであるもう1つの理由です。そしてずっと前に廃止されるべきでした。データ移行の演習を行っているので、非常に柔軟なCLOBデータ型への移行を検討する良い機会です。

いずれにせよ、ターゲット列に大量のデータが含まれていることを示すための規則が必要です。

LONGデータボリュームの正確な範囲を本当に知る必要がある場合は、LONGをCLOB列にアンロードし、代わりにそれらを合計することをお勧めします。

于 2010-08-18T10:49:08.410 に答える