简体   繁体   English

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

[英]How to call a DB2 stored procedure passing a List<String> as param?

Java version: Java1.8 Java版本:Java1.8
JDBC: db2jcc4-11.1.1.1 JDBC:db2jcc4-11.1.1.1
Ant1.7蚂蚁1.7
Websphere8.5 Websphere8.5

I am upgrading a service to allow for passing an array of currency codes (AA, BB, CC, DD) into a stored procedure.我正在升级一项服务以允许将一组货币代码(AA、BB、CC、DD)传递到存储过程中。 The NSP work has been completed and verified. NSP 工作已经完成并得到验证。 Here is my code below.下面是我的代码。

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>();
    }

}

During runtime, I am getting this error when submitting the change to my database:在运行时,我将更改提交到我的数据库时收到此错误:

FATAL com.pseuplex.j2ee.ExceptionFilter - java/sql/Connection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array;致命的 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/Object;)Ljava/sql/Array; java.lang.AbstractMethodError: java/sql/Connection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array;

I have checked pages of stack overflow questions similar to this one, but none of the solutions have led me to a solution.我检查了与此类似的堆栈溢出问题的页面,但没有一个解决方案让我找到解决方案。 Any help would be greatly appreciated.任何帮助将不胜感激。

Regarding the AbstractMethod error, that typically happens when you invoke an interface method which is at a higher JDBC spec level than the implementation actually implements.关于 AbstractMethod 错误,这通常发生在调用接口方法时,该方法的 JDBC 规范级别高于实现实际实现的级别。 The java.sql.Connection.createArrayOf method was added in JDBC 4.0. JDBC 4.0 中添加了 java.sql.Connection.createArrayOf 方法。 Are you using an older spec level JDBC driver JAR that implements an older version such as JDBC 3.0 which would lack the createArrayOf method?您是否使用旧版本的规范级别 JDBC 驱动程序 JAR,它实现了旧版本(例如 JDBC 3.0),该版本将缺少 createArrayOf 方法? That seems like a good possibility based on the error you reported.根据您报告的错误,这似乎是一个很好的可能性。 If so, just move up to a newer spec level version of the JDBC driver.如果是这样,只需升级到 JDBC 驱动程序的较新规范级别版本​​。

Just following up on this for future reference, I found my solution to the AbstractMethodError.只是跟进此以供将来参考,我找到了 AbstractMethodError 的解决方案。 I was using an old version of dbcp and ended up having to upgrade to commons-dbcp2 as well as commons-pool2.我使用的是旧版本的 dbcp,最终不得不升级到 commons-dbcp2 和 commons-pool2。

After the upgrade, I simply changed my datasource to target dbcp2 and everything worked fine.升级后,我只是将数据源更改为目标 dbcp2,一切正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM