如何调用将列表作为参数传递的 DB2 存储过程<String>?



Java版本:Java1.8
JDBC: db2jcc4-11.1.1.1
Ant1.7
Websphere8.5

我正在升级一个服务,以允许将一组货币代码(AA、BB、CC、DD)传递到存储过程中。NSP工作已经完成并得到验证。下面是我的代码。

Mapper

<!-- Call XXXXXXX- InputArray -->
<select id="addOrRemoveDataList" statementType="CALLABLE"
parameterType="globalTradeAwayParams">
{CALL ${dbPackageName}.XXXXXXX
(#{param.ownerId, mode=IN, jdbcType=INTEGER},
#{param.actionInd, mode=IN, jdbcType=CHAR},
#{param.addOrRemoveElementsCount, mode=IN, jdbcType=INTEGER},
#{param.addOrRemoveList, jdbcType=ARRAY, mode=IN, jdbcTypeName=VARCHAR, typeHandler=com.pseuplex.core.db.handlers.StringHandler})}
</select>

StringHandler

public class StringHandler implements TypeHandler<List<String>> {

// Adding logger to StringHandler
private static Logger log = Logger.getLogger(StringHandler.class);

@Override
public void setParameter(PreparedStatement arg0, int arg1, List<String> arg2, JdbcType arg3) throws SQLException {
// TODO Auto-generated method stub
log.info("Prepared statement: " + arg0.toString());
log.info("Arg1: " + arg1);
log.info("Object: " + arg2);
log.info("JDBC Type: " + arg3);

// TODO Auto-generated method stub
Array string = null;
int index = 0;
String[] stringArray;

if (arg2 == null)
stringArray = new String[0];
else {
stringArray = new String[arg2.size()];
for (String i : arg2) {
stringArray[index] = i;
index++;
}
}
Connection con = arg0.getConnection();

// ERROR THROWN HERE
string = con.createArrayOf("VARCHAR", stringArray);

arg0.setArray(arg1, string);

}
@Override
public List<String> getResult(ResultSet arg0, String arg1)
throws SQLException {
// TODO Auto-generated method stub
return new ArrayList<String>();
}
@Override
public List<String> getResult(ResultSet arg0, int arg1) throws SQLException {
// TODO Auto-generated method stub
return new ArrayList<String>();
}
@Override
public List<String> getResult(CallableStatement arg0, int arg1)
throws SQLException {
// TODO Auto-generated method stub
return new ArrayList<String>();
}
}

在运行时,当我提交更改到我的数据库时,我得到这个错误:

致命com.pseuplex.j2ee。ExceptionFilter - java/sql/Connection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;])Ljava/sql/Array;java.lang.AbstractMethodError: java/sql/Connection.createArrayOf (Ljava/lang/String; (Ljava/lang/对象;)Ljava/sql/数组;

我已经检查了类似于这个的堆栈溢出问题的页面,但没有一个解决方案能让我找到解决方案。如有任何帮助,我将不胜感激。

关于AbstractMethod错误,通常发生在调用JDBC规范级别高于实现实际实现的接口方法时。在JDBC 4.0中增加了java.sql.Connection.createArrayOf方法。您是否在使用旧的规范级别的JDBC驱动程序JAR,该JAR实现了旧版本(如JDBC 3.0),缺少createArrayOf方法?根据你报告的错误,这似乎是一个很好的可能性。如果是这样,只需升级到JDBC驱动程序的新规范级别版本。

为了将来的参考,我在这里找到了AbstractMethodError的解决方案。我使用的是旧版本的dbcp,最后不得不升级到commons-dbcp2和commons-pool2。

升级后,我简单地将我的数据源更改为目标dbcp2,一切都工作正常。

最新更新