简体   繁体   English

发送和检索数组列表到oracle存储过程

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

I'm trying to push "Arraylist" to oracle stored procedure and after making necessary modification, the object it is returned back. 我试图将“ Arraylist”推送到oracle存储过程,并进行必要的修改后,将其返回给对象。

I have an oracle stored procedure with an inout parameter which is "AS TABLE OF TYPE". 我有一个带inout参数的oracle存储过程,该参数是“ AS TABLE OF TYPE”。

I'm able to make the call using Mybatis by implements TypeHandler and overrides its method public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException 我可以通过实现TypeHandler并使用Mybatis进行调用,并重写其方法public void setParameter(PreparedStatement ps,int i,Object parameter,JdbcType jdbcType)抛出SQLException

But I'm facing issue while retrieving the object. 但是在检索对象时遇到了问题。

For retrieving I Override the below method. 对于检索,我重写以下方法。

public Object getResult(CallableStatement cs, int columnIndex) throws 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);
    }

} }

I'm getting the below error java.lang.IllegalAccessError: tried to access class oracle.jdbc.driver.OracleCallableStatement 我收到以下错误java.lang.IllegalAccessError:试图访问类oracle.jdbc.driver.OracleCallableStatement

Statement generating the error is 产生错误的陈述是

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


Any thoughts/help on how to retrieve table of type object from oracle . 关于如何从oracle检索对象类型表的任何想法/帮助。


I'm able to implement it successfully using Spring, Mybatis & Oracle. 我能够使用Spring,Mybatis和Oracle成功实现它。 The reference code to implement is as below 要实现的参考代码如下

1) Create Type in Database 1)在数据库中创建类型

CREATE OR REPLACE TYPE TypeName AS OBJECT( 创建或替换类型TypeName作为对象(
Field1 varchar(6), Field2 varchar(6) ) Field1 varchar(6),Field2 varchar(6))

2) Create Table of Type in Database 2)在数据库中创建类型表

CREATE OR REPLACE TYPE TableTypeName AS TABLE OF TypeName; 创建或替换类型TableTypeName作为TypeName表;

3) Create transfer object in java with 2 fields 3)用2个字段在Java中创建传输对象

4) Generate necessary arraylist for transfer object 4)为传输对象生成必要的arraylist

5) Create database call 5)创建数据库调用

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

6) Create handler 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) Make the database call 7)进行数据库调用

Enjoy... :) 请享用... :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM