将对象数组从Java传递到PLSQL存储过程
我试图将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.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;index upload_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);
}