2011-07-21 45 views
0
传递一个巨大的字符串的存储功能

我有以下类型和功能:问题通过IBatis.Net

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> 

当我运行这段代码传递一个DeviceAlias对象与一个巨大的SerialNumber属性集(例如SN0001,SN0002; ...),我收到以下错误:

ORA-01460: unimplemented or unreasonable conversion requested 

有关如何解决此问题的任何想法? PS:对于小型条目,此代码可以工作

回答

-1

此错误通常是在您混用PLSQL & SQL时引起的。

试图取代你与“VARCHAR “DBTYPE”(CLOB)如下:

<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修补到最新版本来解决的错误。
+0

This works。 但是我必须在将字符串传递给该函数之前检查该字符串,以避免它变得大于4000. –

+1

但是,如果您确实想要传递CLOB,该怎么办?这不是一个正确的答案,它是一个混乱。 – demongolem