2008-09-25 29 views
7

我已經四處尋找了一個很好的例子,但是我還沒有碰到過。我想使用IBATIS框架將一個自定義的字符串數組從Java傳遞到Oracle並返回。有沒有人有一個很好的鏈接到一個例子?我從IBATIS調用存儲過程。在java中傳入並返回ibatis和oracle中的自定義數組對象

感謝

+0

什麼叫一*定製*字符串數組是指提供了額外的屬性jdbcTypeName = ORACLE_REAL_ARRAY_TYPE,這是莫名其妙地不同的String [] ? – 2008-09-26 00:36:26

回答

2

你必須先從TypeHandler定製的實例。我們寧願實施更簡單的TypeHandlerCallback,但在這種情況下我們需要訪問底層Connection

public class ArrayTypeHandler implements TypeHandler { 

    public void setParameter(PreparedStatement ps, int i, Object param, String jdbcType) 
      throws SQLException { 
     if (param == null) { 
      ps.setNull(i, Types.ARRAY); 
     } else { 
      Connection conn = ps.getConnection(); 
      Array loc = conn.createArrayOf("myArrayType", (Object[]) param); 
      ps.setArray(i, loc); 
     } 
    } 

    public Object getResult(CallableStatement statement, int i) 
      throws SQLException { 
     return statement.getArray(i).getArray(); 
    } 
    ... 
} 

然後,接線它在iBATIS的配置:

<?xml version="1.0"?> 
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> 

<sqlMap namespace="arrayTest"> 

    <parameterMap id="storedprocParams" class="map"> 
     <parameter property="result" mode="OUT" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/> 
     <parameter property="argument" mode="IN" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/> 
    </parameterMap> 

    <procedure id="storedproc" parameterMap="arrayTest.storedprocParams"> 
     {? = call My_Array_Function(?)} 
    </procedure> 

</sqlMap> 

希望這有助於!

+0

這是一個很好的起點 - 我必須從RAD獲得本地連接,添加描述我的自定義數組的描述符,並確保數據庫中的對象可以訪問。看看我在答案中做了什麼。 – Justin 2008-09-29 20:39:23

2

bsanders給了我一個很好的起點 - 這是我必須做的,使其在RAD環境(websphere 6.2)中工作。

public Object getResult(CallableStatement statement, int i) throws SQLException { 
    return statement.getArray(i).getArray(); //getting null pointer exception here 
} 

public void setParameter(PreparedStatement ps, int i, Object param, String jdbcType) throws SQLException { 
    if (param == null) { 
     ps.setNull(i, Types.ARRAY); 

    } else { 
     String[] a = (String[]) param; 
     //ARRAY aOracle = ARRAY.toARRAY(a, (OracleConnection)ps.getConnection()); 

     //com.ibm.ws.rsadapter.jdbc.WSJdbcConnection 
     w = (com.ibm.ws.rsadapter.jdbc.WSJdbcConnection)ps.getConnection()); 

     //com.ibm.ws.rsadapter.jdbc.WSJdbcObject x; 
     Connection nativeConnection = Connection)WSJdbcUtil.getNativeConnection((WSJdbcConnection)ps.getConnection()); 

     ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("F2_LIST", nativeConnection); 
     ARRAY dataArray = new ARRAY(descriptor, nativeConnection, a); 
     ps.setArray(i, dataArray); 
    } 
} 

注意我必須得到的nativeConnection,我必須做的描述符,等等。但是,雖然我可以將一些東西作爲字符串數組傳遞到數據庫中,但我一直無法弄清楚爲什麼我沒有收回任何東西。我OUT參數(的getResult(CallableStatement的statment,int i)以拋出一個空指針異常,即使我設置了參數,在數據庫中PLSQL。

--stored procedure to take a | delimited ids 
    PROCEDURE array_test (argument IN f2_list, result OUT f2_list) 
    AS 
     l_procname_v VARCHAR2 (50)     := 'array_test'; 
     l_param_list VARCHAR2 (2000) 
        := l_procname_v || ' param_values: p_string: '; 

     p_status_n  NUMBER; 
     p_message_v VARCHAR2 (2000); 
     ret_list f2_list := new f2_list(); 
     l_count_v varchar2(200); 
    BEGIN 

     l_count_v := argument.COUNT; 
     for x in 1..argument.count 
     LOOP 
      pkg_az_common_util.az_debug (package_nm, 
            l_procname_v, 
            pkg_az_data_type_def.debug_num, 
            argument(x) 
           ); 
     end loop; 

     pkg_az_common_util.az_debug (package_nm, 
            l_procname_v, 
            pkg_az_data_type_def.debug_num, 
            l_count_v 
           ); 
     ret_list.extend(); 
     ret_list(1) := 'W'; 
     ret_list.extend(); 
     ret_list(2) := 'X'; 
     ret_list.extend(); 
     ret_list(3) := 'Y'; 
     ret_list.extend(); 
     ret_list(4) := 'Z'; 

     result := ret_list; 


    EXCEPTION 
     WHEN OTHERS 
     THEN 
     p_status_n := pkg_az_common_util.get_error_code; 
     p_message_v := 
       TO_CHAR (p_status_n) 
      || '|' 
      || 'Oracle Internal Exception(' 
      || l_procname_v 
      || ')' 
      || '|' 
      || TO_CHAR (SQLCODE) 
      || '|' 
      || SQLERRM 
      || l_param_list; 
     standard_pkg.log_error (package_nm, 
           l_procname_v, 
           SQLCODE, 
           p_message_v 
           ); 

     IF p_status_n = 1 
     THEN 
      RAISE; 
     END IF; 
    END array_test; 

這裏是我如何訪問它:?

Map queryParamsTest = new HashMap(); 

     String[] testArray = {"A", "B", "C"}; 

     queryParamsTest.put("argument", testArray); 



     DaoUtils.executeQuery(super.getSqlMapClientTemplate(), 
       "arrayTest", queryParamsTest, queryParamsTest 
       .toString()); //just executes query 


     String[] resultArray = (String[])queryParamsTest.get("result"); 

     for(int x = 0; x< resultArray.length; x++) 
     { 
      System.out.println("Result: " + resultArray[x]); 
     } 



<parameterMap id="storedprocParams" class="map">   
     <parameter property="argument" mode="IN" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/>  
     <parameter property="result" mode="OUT" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/>   
    </parameterMap>  
    <procedure id="arrayTest" parameterMap="storedprocParams">   
     {call pkg_az_basic_dev.array_test(?, ?)}  
    </procedure> 

任何想法

0

嘗試使用statement.getObject(i),然後轉換爲數組

1

那麼,在公司的傢伙發現了解決方案:你需要在你的類型控制器已經實現的getResult方法(S)和你的映射器

+0

我注意到ARRAY類型在batis文檔中不受支持,我發現desinformative – tomasb 2011-10-20 10:15:50

相關問題