将对象数组从Java传递到PLSQL存储过程

将对象数组从Java传递到PLSQL存储过程,java,oracle,stored-procedures,jdbc,plsql,Java,Oracle,Stored Procedures,Jdbc,Plsql,我试图将Java数组对象传递给PLSQL存储过程,但是当我试图执行时,我得到以下异常 java.sql.SQLException: Inconsistent java and sql object types 我的刀类: public class UploadTradeDaoImpl implements UploadTradeDao{ private static Logger log = LoggerFactory .getLogger(UploadTradeDaoImp

我试图将Java数组对象传递给PLSQL存储过程,但是当我试图执行时,我得到以下异常

java.sql.SQLException: Inconsistent java and sql object types
我的刀类:

public class UploadTradeDaoImpl implements UploadTradeDao{

private static Logger log = LoggerFactory
        .getLogger(UploadTradeDaoImpl.class);
private SqlSessionFactory sqlSessionFactory;

public SqlSessionFactory getSqlSessionFactory() {
    return sqlSessionFactory;
}

public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
}

public int uploadTrade(List<UploadTrade> uploadTradeList) {

    SqlSession session = sqlSessionFactory.openSession();
    try {
        Connection conn = session.getConnection().getMetaData()
                .getConnection();
        StructDescriptor structDescriptor = StructDescriptor
                .createDescriptor("UPLOADTRADE_OBJ", conn);
        STRUCT[] testStruct= new STRUCT[uploadTradeList.size()];
        ArrayDescriptor arrayDescriptor= ArrayDescriptor.createDescriptor(
                "UPLOADTRADE_REC", conn);
        Object[] upload_obj_array = new Object[uploadTradeList.size()];
        for (int index = 0; index < uploadTradeList.size(); index++) {
            UploadTrade uploadTradeObj = uploadTradeList.get(index);
            Object[] uploadObjects = new Object[] {
                    uploadTradeObj.getBusTrdId(),
                    uploadTradeObj.getIntrnlExtl(),
                    uploadTradeObj.getMarsLe(),
                    uploadTradeObj.getLeg1CflwType(),
                     uploadTradeObj.getLeg2CflwType(),
                    uploadTradeObj.getRestmntCode(),
                    uploadTradeObj.getRestmntQtr(),
                    uploadTradeObj.getTrdId()};
            upload_obj_array[index] = new STRUCT(structDescriptor, conn, uploadObjects);

        }
        ARRAY obj_array = new ARRAY(arrayDescriptor, conn, upload_obj_array);

        CallableStatement callableStatement= conn.prepareCall("call INSERTUPLOADTRADEOBJ(?,?)");
        callableStatement.setArray(1, obj_array);
        callableStatement.registerOutParameter(2, OracleTypes.ARRAY,"UPLOADTRADE_REC");
        callableStatement.execute();


    } catch (Exception e) {
        e.printStackTrace();
        session.rollback();
        log.error("Error! in UploadTrade()" + e.getMessage());
        return 0;
    } finally {

        session.close();

    }
    return 1;

}
公共类UploadTradeDaoImpl实现UploadTradeDao{
专用静态记录器日志=LoggerFactory
.getLogger(UploadTradeDaoImpl.class);
私有SqlSessionFactory SqlSessionFactory;
公共SqlSessionFactory getSqlSessionFactory(){
返回sqlSessionFactory;
}
public void setSqlSessionFactory(SqlSessionFactory SqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory;
}
public int uploadTrade(列表uploadTradeList){
SqlSession session=sqlSessionFactory.openSession();
试一试{
连接conn=session.getConnection().getMetaData()
.getConnection();
StructDescriptor StructDescriptor=StructDescriptor
.createDescriptor(“上传交易对象”,康涅狄格州);
STRUCT[]testStruct=new STRUCT[uploadTradeList.size()];
ArrayDescriptor ArrayDescriptor=ArrayDescriptor.createDescriptor(
“上传交易记录”,康涅狄格州);
Object[]upload_obj_array=新对象[uploadTradeList.size()];
对于(int index=0;indexupload_obj_array[index]=新结构(structDescriptor、conn、uploadObjects);
}
ARRAY obj_ARRAY=新数组(arrayDescriptor,conn,upload_obj_ARRAY);
CallableStatement CallableStatement=conn.prepareCall(“调用INSERTUPLOADTRADEOBJ(?,)”;
setArray(1,obj_数组);
registerOutParameter(2,OracleTypes.ARRAY,“UPLOADTRADE_REC”);
callableStatement.execute();
}捕获(例外e){
e、 printStackTrace();
session.rollback();
log.error(“UploadTrade()中的错误”+e.getMessage());
返回0;
}最后{
session.close();
}
返回1;
}
我使用以下两个链接进行此操作:

请让我知道我做错了什么

提前感谢

示例 词汇表
  • 两种类型——Oracle中的数组类型
  • T_ARRAY--Oracle中的数组类型
  • userArray——java中的数组
  • AuthenticationTags,contentId——java中的字符串对象
  • conn——java中的连接对象
  • call——可调用语句

尝试并
setObject()
而不是
setArray()
Hi OracleUser感谢您的建议,但我也尝试了setObject(),但现在正在工作。该过程可能有错误。您在哪一行准确地得到了错误?在执行中?上载\u obj\u array[索引]=新结构(structDescriptor,conn,uploadObjects);在此行中,类型
UPLOADTRADE_OBJ
的定义是什么?oracle似乎在抱怨对象[]中的参数与oracle期望的类型不匹配。
userEntitlementDescriptor =  ArrayDescriptor.createDescriptor("TWO_D_TYPE", conn.unwrap(oracle.jdbc.OracleConnection.class));
    userDescriptor = ArrayDescriptor.createDescriptor("T_ARRAY", conn.unwrap(oracle.jdbc.OracleConnection.class));  
    userListArray = new ARRAY(userDescriptor, conn.unwrap(oracle.jdbc.OracleConnection.class), userArray);  

    call = conn.prepareCall("{ ? = call USER_ENTITLEMENT_CHECK(?,?,?) }");
    call.registerOutParameter(1, Types.ARRAY, "TWO_D_TYPE"); // or whatever it is
    call.setString(2, entitlementTags);
    call.setString(3, contentId);
    call.setArray(4, userListArray);
    call.execute();
    userEntitlementArray = (ARRAY) call.getObject(1);
    ResultSet rsl = userEntitlementArray.getResultSet();
    while(rsl.next()){
      ARRAY varray3 = (ARRAY) rsl.getObject (2);
      String[] entitlementResultArray = (String[])varray3.getArray();
      userEntitlementMap.put(entitlementResultArray[0], entitlementResultArray[1]);
    }

}
catch(SQLException sqlException){
    SERVICE_LOGGER.error("Error while making silverpop call for content id--"+contentId);
}