0

私は次のタイプと機能を持っています:

CREATE OR REPLACE TYPE SERIAL_NUMBER_TABLE AS TABLE OF VARCHAR2(4000);

CREATE OR REPLACE FUNCTION F_DEVICE_SERIAL_TABLE(
  SN_LIST       IN CLOB,
  SN_DELIMITER  IN VARCHAR2 DEFAULT ';')
  RETURN SERIAL_NUMBER_TABLE
IS
  V_STRING LONG := SN_LIST || SN_DELIMITER;
  V_POS PLS_INTEGER;
  V_DATA SERIAL_NUMBER_TABLE := SERIAL_NUMBER_TABLE();
BEGIN
  LOOP
    V_POS := INSTR(V_STRING, SN_DELIMITER);
    EXIT WHEN (NVL(V_POS, 0) = 0);
    V_DATA.EXTEND;
    V_DATA(V_DATA.COUNT) := TRIM(SUBSTR(V_STRING, 1, V_POS - 1));
    V_STRING := SUBSTR(V_STRING, V_POS + 1);    
  END LOOP ;
  RETURN V_DATA;
END F_DEVICE_SERIAL_TABLE;

そして、IBatis マップ xml 構成で次のマッピングを介して巨大な文字列を渡そうとしています。

<parameterMaps>
    <parameterMap id="StringClob" class="DeviceAlias">
      <parameter property="SerialNumber" type="String" dbType="CLOB"/>
    </parameterMap>
</parameterMaps>

<select id="SelectBySerialNumberList" parameterMap="StringClob" resultMap="DeviceResult">
  <![CDATA[
  SELECT *
  FROM DEVICE D
  INNER JOIN 
    (SELECT * FROM TABLE(CAST(F_DEVICE_SERIAL_TABLE(?) AS SERIAL_NUMBER_TABLE))) SERIAL_TABLE
  ON SERIAL_TABLE.COLUMN_VALUE = D.S_NUMBER
  ]]>
</select>

このコードを実行して、巨大な SerialNumber プロパティ セット (たとえば、SN0001;SN0002;...) を持つ DeviceAlias オブジェクトを渡すと、次のエラーが発生します。

ORA-01460: unimplemented or unreasonable conversion requested

この問題を回避する方法のアイデアはありますか? PS: 小さなエントリの場合、このコードは機能します

4

1 に答える 1

-1

このエラーは通常、PLSQL と SQL を混在させると発生します。

次のように、「dbType」(CLOB) を「VARCHAR」に置き換えてみてください。

<parameterMaps>
    <parameterMap id="StringClob" class="DeviceAlias">
        <parameter property="SerialNumber" type="String" dbType="VARCHAR"/>
    </parameterMap>
</parameterMaps>

他に次のような原因が考えられます。

  1. 互換性のない文字セットにより、ORA-01460 が発生する可能性があります
  2. SQL Developerを使用して、4000バイトを超えるバインド変数値に文字列を渡そうとすると、ORA-01460が発生する可能性があります
  3. ODP では、10.2 クライアントと 10.2 ODP から 11.1 クライアントと 11.1.0.6.10 ODP に移動するユーザーが ORA-01460 エラーを報告しました。これはバグであり、ODP を最新バージョンにパッチすることで修正する必要があります。
于 2011-07-27T11:29:52.743 に答える