在准备好的state中设置数组db2不能正常运行Java

时间:2016-12-12 13:14:13

标签: java jdbc db2

我正面临着这个错误 现在安静一下,我有这个疑问:

String sql = "select US_KEY, US_LOGID, US_PASSWORD, US_SESSION, US_LASTLOGIN,\n" +
"   US_LASTACCESS, US_INTENTOS, US_NOMBRE, US_APELLIDO, US_ESTADO,\n" +
"   US_RAZON, US_RUT, US_DIGITOV, US_DIRECCION, US_EMAIL,\n" +
"   US_TELEFONO, US_CARGO, TU_KEY, EM_KEY, US_ULTIMO_CAMBIO_PASS,\n" +
"   US_TELEFONO2, US_PIN, US_BLOQUEO, US_CHECK_VOLATIL_PASS,\n" +
"   US_PV_KEY_SELECTED, US_VD_KEY_SELECTED, US_SC_KEY_SELECTED,\n" +
"   US_SECRET_ASK\n" +
" from DBUSER.USUARIO\n" +
" where US_KEY in (?) ";

我正在设置这样的值:

Array array = query.getStatement().getConnection().createArrayOf("BIGINT",arrayOfLong);
query.setArray(param.getName(), array);

我使用com.ibm.db2.jcc.DB2Driver驱动程序连接到db2数据库并收到此错误:

  

com.ibm.db2.jcc.am.SqlSyntaxErrorException:   [jcc] [1091] [10417] [3.62.56]无效的数据转换:参数   实例com.ibm.db2.jcc.am.p@6b09bb57对请求的内容无效   转换。 ERRORCODE = -4461,SQLSTATE = 42815           在com.ibm.db2.jcc.am.fd.a(fd.java:676)

不可能将数组设置为db2的准备好的内容吗?它不受支持?还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

查看site of IBM似乎不,不支持。

在表19(支持setArray方法)中搜索方法java.sql.PreparedStatement

答案 1 :(得分:0)

您必须以编程方式创建循环以创建IN (?,?,? ... )子句,并为setXXX()的每个?创建另一个PreparedStatement循环。

另外,如果1000s元素中的IN子句编号,则可能需要将其拆分并将部分结果与UNION合并。

// construct IN clause
for (int i =0; i < us_keys.length(); i++ ) {
  inbuffer.append((i>0)?(',?'):('?'));
}
sql.append( "IN (" );
sql.append( inbuffer );
sql.append( ")" );

然后

// assign all keys
int inkey=0;
for ( String us_key : us_keys ) {
   stmt.setString(++inkey,us_key);
}