0

我有一些JDBC代码如下,我使用 gemfireXD 作为DB.

我正在尝试在输入列表上并行执行过程。我作为参数传递给过程的列表的大小不是固定的,它是在执行以下代码中的查询后确定的。此列表的大小可能太大。

代码:

 private static void executeProc (Connection cxn) throws SQLException {

          Statement stmt = null;
          try {
                 stmt = cxn.createStatement();

                 stmt.execute("select distinct field1 from Table1");
                 ResultSet rs = stmt.getResultSet();
                 List<String> fieldList = new ArrayList<String> ();
                 while (rs.next()) {
                       fieldList.add(rs.getString("field1"));
                 }
                 Array fieldArray = cxn.createArrayOf("VARCHAR", fieldList.toArray(new String[fieldList.size()]));
                 CallableStatement callableStmt = cxn.prepareCall("{CALL procedure1() ON TABLE Table1 WHERE field1 IN (?)}");
                 callableStmt.setArray(1, fieldArray);
                 callableStmt.execute();
          } catch (SQLException e) {
                 e.printStackTrace();
          }
   }

错误: 在执行代码时,它给出了以下运行时错误。

未实现的功能:createArrayOf(String, Object[])

问题:

gemfireXD 文档说可以使用 setArray 方法传递一个列表来执行数据感知过程。但是当我处理实际的 API 时,setAaary() 方法需要一个数组对象而不是一个列表。

GemfireXD 文档在其支持 setArray() 方法的文档 (1.4.0) 中提供了此类过程调用的示例。文档中的直接示例如下: -

// GemFire XD 数据感知过程调用。

CallableStatement callableStmt = connection.prepareCall("{CALL order_credit_check() ON TABLE Orders WHERE customerID IN (?)}"); callableStmt.setArray(1, <-客户 ID 列表->);

如何调用preparedStatement.setArray 来设置查询中的参数?

任何人都可以建议任何其他实现方法来达到预期的结果吗?

4

1 回答 1

1

GemFire XD 不支持 Array 数据类型,因此 createArrayOf 方法将不起作用。

对于您想在 where 子句中使用 in-list 的查询类型,您可能必须将每个单独的值设置为参数

CallableStatement callableStmt = cxn.prepareCall("{CALL procedure1() ON TABLE Table1 WHERE field1 IN (?, ?, ?)}");
callableStmt.setInt(1, 1);
callableStmt.setInt(2, 2);
callableStmt.setInt(3, 3);
....
于 2015-06-15T09:39:54.893 回答