使用Postgres从JDBC准备的语句失败,“没有参数$ 1”

时间:2014-02-12 12:25:57

标签: java postgresql jdbc

我正在尝试使用Postgres的官方JDBC驱动程序9.3-1100从Scala应用程序中使用Postgres 9.1的prepared statements功能。

如果我这样做,一切正常,我得到了“foo”:

conn.prepareStatement("PREPARE prep(text) AS SELECT $1").executeUpdate();
val cmd = conn.prepareStatement("EXECUTE prep('foo')");

但是,如果我尝试对其进行参数化:

conn.prepareStatement("PREPARE prep(text) AS SELECT $1").executeUpdate();
val cmd = conn.prepareStatement("EXECUTE prep(?)");
cmd.setString(1, "foo");

然后在执行命令时出现此错误:

org.postgresql.util.PSQLException: ERROR: there is no parameter $1
  Position: 14
  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161)
  org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890)
  org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
  org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:560)
  org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
  org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:410)
  com.jolbox.bonecp.PreparedStatementHandle.execute(PreparedStatementHandle.java:140)

我已经尝试过几种不同的方式,但我找不到任何方法来成功地参数化这个查询。

我使用Npgsql驱动程序在.net应用程序中做了类似的事情并且它有效,所以我无法弄清楚为什么JDBC驱动程序不允许我这样做。这仅仅是JDBC驱动程序的限制吗?有没有解决办法?

1 个答案:

答案 0 :(得分:2)

使用JDBC准备语句时,需要准备实际语句。您当前正在尝试准备和执行PostgreSQL特定的PREPAREEXECUTE命令(这可能是驱动程序内部使用的命令)。

你需要这样做:

val cmd = conn.prepareStatement("SELECT ?");
cmd.setString(1, "foo");

虽然我不确定这是否会起作用,因为PostgreSQL无法在此决定参数类型。