如何从jdbc代码传递数组对象

时间:2010-07-14 16:53:31

标签: java jdbc core informix

我在informix 11.5数据库中有一个存储过程 get_data(estargs set(char(1000)not null))。我必须使用此存储过程才能从数据库中获取值。

我尝试过这种方式,但它失败了:

conn = dataSource.getConnection();
            String [] arrayObj={"and code = 'Value1'","and lmt= 10000.000"};
            CallableStatement test=conn.prepareCall("{call get_data(?)}");
            test.setObject(1, arrayObj);
            test.execute();
            ResultSet testrs = test.getResultSet();
            while (testrs.next()) {
                int data = testrs.getInt(1);
                System.out.println(data);

            }

这不起作用。你觉得我做错了什么?

2 个答案:

答案 0 :(得分:2)

那是不可能的。取代

conn.prepareCall("{call get_data(?)}");

通过

conn.prepareCall("{call get_data(?, ?)}");

并替换

test.setObject(1, arrayObj);

通过

test.setObject(1, arrayObj[0]);
test.setObject(2, arrayObj[1]);

相关问题:


更新:让它更“动态”,您希望借助以下两种实用方法自行生成和填充占位符:

public static String preparePlaceHolders(int length) {
    StringBuilder builder = new StringBuilder(length * 2 - 1);
    for (int i = 0; i < length; i++) {
        if (i > 0) builder.append(',');
        builder.append('?');
    }
    return builder.toString();
}

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

可以按如下方式使用:

private static final String SQL_CALL_GET_DATA = "{call get_data(%s)}";

// ...
String sql = String.format(SQL_CALL_GET_DATA, preparePlaceholders(arrayObj.length));
statement = connection.prepareCall(sql);
setValues(statement, arrayObj);
// ...

答案 1 :(得分:0)

您是否尝试过使用java.sql.Array