Проблема передачи огромной строки в хранимую функцию через IBatis.Net - PullRequest
0 голосов
/ 22 июля 2011

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

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;

И я пытаюсь передать огромную строку через следующее отображение в конфигурации xml карты IBatis:

<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>

Когда я запускаю этот код, передавая объект DeviceAlias ​​с огромным набором свойств SerialNumber (например, SN0001; SN0002; ...), я получаю следующую ошибку:

ORA-01460: unimplemented or unreasonable conversion requested

Любые идеи о том, как обойти эту проблему?PS: для небольших записей этот код работает

1 Ответ

0 голосов
/ 27 июля 2011

Эта ошибка обычно возникает при смешивании 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 до самой последней версии.
...