Java JDBC prepared statement maximum parameter markers
Asked Answered
H

2

16

Im building a large database call using PreparedStatement that has 2000+ parameter markers.

Im getting this error

Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers.
    at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:1139)
    at net.sourceforge.jtds.jdbc.SQLParser.parse(SQLParser.java:156)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.<init>(JtdsPreparedStatement.java:107)
Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers. 

I tried searching the API Docs and google but couldnt find how to configure this.

Does anyone know if it is possible to up this limit? I am aware it is going to be a slow database call but that is fine for now.

Also will this cause me any issues in the long run, would I be better off running it in batches?

Huihuie answered 31/1, 2013 at 17:10 Comment(0)
R
18

Seams like you're stuck at 2000. Here is a cut out from the driver source.

if (params != null && params.size() > 255
     && connection.getPrepareSql() != TdsCore.UNPREPARED
     && procName != null) {
  int limit = 255; // SQL 6.5 and Sybase < 12.50
  if (connection.getServerType() == Driver.SYBASE) {
    if (connection.getDatabaseMajorVersion() > 12 ||
        connection.getDatabaseMajorVersion() == 12 &&
        connection.getDatabaseMinorVersion() >= 50) {
      limit = 2000; // Actually 2048 but allow some head room
    }
  } else {
    if (connection.getDatabaseMajorVersion() == 7) {
      limit = 1000; // Actually 1024
    } else if (connection.getDatabaseMajorVersion() > 7) {
      limit = 2000; // Actually 2100
    }
  }
  if (params.size() > limit) {
   throw new SQLException(
       Messages.get("error.parsesql.toomanyparams",
       Integer.toString(limit)),
       "22025");
  }
}

Here are a blog with examples on how to solve it.

Rooker answered 31/1, 2013 at 17:37 Comment(2)
jTDS1.3 Here is the file sourceforge.net/p/jtds/code/1228/tree/branches/…Rooker
Yes, not the one I wanted though :). I am going to split the query into batches and process 1000 at a time. Might be worth adding this alternative solution to your answerHuihuie
F
0

a few years late, but apache commons has a function ListUtil.partition(list,size) that is useful for this kind of problems.

Foggy answered 3/6 at 21:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.