[英]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.