簡體   English   中英

發送和檢索數組列表到oracle存儲過程

[英]Send & Retrieve array list to oracle stored procedure

我試圖將“ Arraylist”推送到oracle存儲過程,並進行必要的修改后,將其返回給對象。

我有一個帶inout參數的oracle存儲過程,該參數是“ AS TABLE OF TYPE”。

我可以通過實現TypeHandler並使用Mybatis進行調用,並重寫其方法public void setParameter(PreparedStatement ps,int i,Object parameter,JdbcType jdbcType)拋出SQLException

但是在檢索對象時遇到了問題。

對於檢索,我重寫以下方法。

公共對象getResult(CallableStatement cs,int columnIndex)引發SQLException {

    ARRAY array_to_pass = ((OracleCallableStatement) cs).getARRAY(1);       

    /* showing content */
    Datum[] elements = array_to_pass.getOracleArray();

    for (int i = 0; i < elements.length; i++) {
        Object[] element = ((STRUCT) elements[i]).getAttributes();
        String value = (String) element[0];
        System.out.println("array(" + i + ").val=" + value);
    }

}

我收到以下錯誤java.lang.IllegalAccessError:試圖訪問類oracle.jdbc.driver.OracleCallableStatement

產生錯誤的陳述是

ARRAY array_to_pass =(((OracleCallableStatement)cs).getARRAY(1);


關於如何從oracle檢索對象類型表的任何想法/幫助。


我能夠使用Spring,Mybatis和Oracle成功實現它。 要實現的參考代碼如下

1)在數據庫中創建類型

創建或替換類型TypeName作為對象(
Field1 varchar(6),Field2 varchar(6))

2)在數據庫中創建類型表

創建或替換類型TableTypeName作為TypeName表;

3)用2個字段在Java中創建傳輸對象

4)為傳輸對象生成必要的arraylist

5)創建數據庫調用

調用StoredProcedureName(#{Parameter_in,javaType = Object,jdbcType = ARRAY,jdbcTypeName = TableTypeName,mode = INOUT,typeHandler = javaHandlername})

6)創建處理程序

public class javaHandlername implements TypeHandler {
    // Set data to oracle object
    @Override
    public void setParameter(PreparedStatement ps, int i, Object parameter,
        JdbcType jdbcType) throws SQLException 
    {
        List<TO> TOs = (List<TO>) parameter;

        StructDescriptor structDescriptor = StructDescriptor
        .createDescriptor("TypeName", ps.getConnection());
        STRUCT[] structs = null;
        structs = new STRUCT[TOs.size()];
        for (int index = 0; index < TOs.size(); index++) {
            TO to = TO.get(index);
            Object[] params = new Object[2];
            params[0] = fSVDisptchSchedDely.getField1();
            params[1] = fSVDisptchSchedDely.getField2();

            STRUCT struct = new STRUCT(structDescriptor,
            ps.getConnection(), params);
            structs[index] = struct;

        }

        ArrayDescriptor desc = ArrayDescriptor.createDescriptor(
        "TableTypeName", ps.getConnection());
        ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs);
        ps.setArray(i, oracleArray);
    }

    // Set the result back to Java object
    public Object getResult(CallableStatement cs, int columnIndex)
    throws SQLException {

        List<TO> TOs= new ArrayList<TO>();
        Object[] structArray = (Object[]) cs.getArray(columnIndex).getArray();
        oracle.sql.STRUCT mystruct = null;
        for (Object structObj : structArray) {
            TO to= new TO();
            mystruct = (oracle.sql.STRUCT) structObj;
            Object[] structAttr = mystruct.getAttributes();
            to.setField1((String)structAttr[0]));
            to.setField2((String)structAttr[1]));            
            TOs.add(to);
        }
        return TOs;
    }
}



7)進行數據庫調用

請享用... :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM