我正在尝试使用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驱动程序的限制吗?有没有解决办法?
答案 0 :(得分:2)
使用JDBC准备语句时,需要准备实际语句。您当前正在尝试准备和执行PostgreSQL特定的PREPARE
和EXECUTE
命令(这可能是驱动程序内部使用的命令)。
你需要这样做:
val cmd = conn.prepareStatement("SELECT ?");
cmd.setString(1, "foo");
虽然我不确定这是否会起作用,因为PostgreSQL无法在此决定参数类型。