我正在尝试将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;
}
我使用这两个链接这样做: https://community.oracle.com/message/4329339#4329339
请让我知道我做错了什么。
先谢谢
答案 0 :(得分:1)
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);
}