首页 > 解决方案 > 不能在“set variable = ?”上使用参数化 声明,但硬编码有效

问题描述

我想statement_timeout在建立 JDBC 连接后更改参数。因此我有以下代码:

PreparedStatement statement = _connection.prepareStatement("set statement_timeout = ?");
statement.setInt(1, (int) _statementTimeout);
statement.execute();

但是execute()这会导致 SQL 异常清楚地表明我的问号处的语法有错误。

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
  Position: 25

我试图搜索这个问题,但找不到任何正确的答案。页面认为我指的SET是 -UPDATE子句。

我的问题很简单,为什么参数化不起作用?如果我对值进行硬编码,例如

prepareStatement(String.format("set statement_timeout = %s", _statementTimeout))

一切正常,如预期的那样。或者在设置变量时使用参数化是完全错误的?

标签: postgresqljdbc

解决方案


使用等效的函数调用应该可以工作:

prepareStatement("select set_config('statement_timeout', ?, false)");
statement.setString(1, Integer.toString(_statementTimeout));
statement.execute();

请注意,您需要将值作为字符串传递,因为函数的签名是(text, text, boolean)


推荐阅读