java - 设置准备好的语句时获取 ArrayIndexOutOfBoundsException

标签 java

设置sql参数时出现以下异常

java.ljava.lang.ArrayIndexOutOfBoundsException: 8
at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)
    at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623)
    at oracle.jdbc.driver.OraclePreparedStatement.(OraclePreparedStatement.java:1212)
    at oracle.jdbc.driver.T4CPreparedStatement.(T4CPreparedStatement.java:28)
    at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3140)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3042)
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5890)

代码:

String sql = "insert into TEST_TABLE1(Field1,Field2,Field3,Field4,Field5,Field6,Field7,Field8,Field9,Field10) values(?,?,?,?,?,?,?,?,?,TEST_SEQ.nextval)";

protected static PreparedStatement prepareStatement(Connection connection , String sql , String idName, Object... values) throws SQLException{

    PreparedStatement statement = connection.prepareStatement(sql, new String[] {idName});

    setValues(statement, values);
    return statement;
}

protected static void setValues (PreparedStatement statement , Object... values) throws SQLException{
    for( int i = 0; i < values.length;i++){
        statement.setObject(i+1,values[i]);
    }
}

public long create (Connection connection, String sql, String idName, Object... parameters) throws ClassNotFoundException , SQLException{

    long key = -1;
    PreparedStatement statement = null;
    ResultSet resultset = null;

    try{
        statement = prepareStatement(connection,sql,idName,parameters);
        logger.debug("prepareStatement created");

        statement.execute();
        resultset = statement.getGeneratedKeys();

        if(resultset != null && resultset.next()){
            key = resultset.getLong(1)
        }
        logger.debug("key :"+key);

    }catch(SQLException sqle){
        logger.debug("error while creating db :"+slqe);
        throw sqle;
    } finally{
        close(statement,resultset);
    }
    return key;
}

最佳答案

Refer to "JDBC - Oracle ArrayIndexOutOfBoundsException"

ArrayIndexOutOfBoundsException when use AutoGeneratedKeys and Oracle

我也遇到过类似的问题

1>Get a sequence value before calling create( method params ... ) long sequnceVal = getSequence( String sequenceSql);

2>将prepareStatement改为

    protected static PreparedStatement prepareStatement(Connection connection,
        String sql, String idName, Object... values)
        throws SQLException {

    PreparedStatement statement = connection.prepareStatement(sql);

    setValues(statement, values);
    return statement;
}

关于java - 设置准备好的语句时获取 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32108769/

相关文章:

java - Java-音频值/变量?

java - 为什么我的项目溢出了 LinearLayout?

java - ((Java) 在 if/else if/else 循环之后返回语句?

java - 如何将 Map<Object, List<Object>> 传递给 Struts 2 中的操作

java - 是否有可能在java中永久设置按钮的位置

java - 管理配置数据的最佳方式是什么

java - while '(' 后的空语句预期错误

java - 减少 XML 文档上的重复循环代码

java - 在 android (java) 中启用/禁用 MIDI channel

java - lwjgl 3 macOS 创建窗口时出现问题