2011-07-21 44 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