【问题标题】:Pass Array of objects From Java to PLSQL Stored Procedure将对象数组从 Java 传递到 PLSQL 存储过程
【发布时间】:2014-08-08 17:58:07
【问题描述】:

我正在尝试将 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;

}

我正在使用以下 2 个链接执行此操作: https://community.oracle.com/message/4329339#4329339

Pass array from Java to Oracle: java.sql.SQLException: Fail to convert to internal representation:error

请让我知道我做错了什么。

提前致谢

【问题讨论】:

  • 试试OracleCallableStatementsetObject() 而不是setArray()
  • 您好 OracleUser 感谢您的建议,但我也尝试使用 setObject() 但现在工作是否存在程序可能出错的任何可能性。
  • 你在哪一行得到错误?在执行中?
  • upload_obj_array[index] = new STRUCT(structDescriptor, conn, uploadObjects);在这一行
  • UPLOADTRADE_OBJ这个类型的定义是什么? oracle 似乎在抱怨您在 Object[] 中的参数与 Oracle 期望的类型不匹配。

标签: java oracle stored-procedures jdbc plsql


【解决方案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);
}

词汇表

  • TWO_D_TYPE -- Oracle 中的数组类型,
  • T_ARRAY -- Oracle 中的数组类型,
  • userArray -- java 中的数组,
  • entitlementTags,contentId -- java 中的字符串对象,
  • conn -- java 中的连接对象,
  • call -- 可调用语句

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2015-10-03
    • 2017-03-30
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多