org.postgresql.util.PSQLException:错误:语法错误在"$ 1"或附近

Kev*_*iss 14 java postgresql jdbc

我得到这个PSQLException:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
  Position: 37
Run Code Online (Sandbox Code Playgroud)

当我运行以下代码时:

ps = connection.prepareStatement("SELECT current_timestamp + INTERVAL ?;");
ps.setString(1, "30 minutes");
System.out.println(ps);
rs = ps.executeQuery();
Run Code Online (Sandbox Code Playgroud)

但是,println函数在控制台中显示:

SELECT current_timestamp + INTERVAL '30 minutes'
Run Code Online (Sandbox Code Playgroud)

谁知道什么是错的?控制台中的查询在pgAdmin中运行正常,所以我知道它不是语法错误.

Rea*_*tic 19

虽然在INTERVAL '30 minutes'直接在控制台中编写SQL时语法是有效的,但它实际上被认为是区间文字,并且在单词INTERVAL后面的字符串不是文字字符串的情况下不起作用.

PostgreSQL中的预处理语句在服务器端实现,PREPARE并且每个语句都?被视为服务器上的实际变量.这也是为什么它抱怨,$1尽管你从未$在你的陈述中写过.

因此,字面语法不适用于预准备语句.

不要让println准备好的语句的字符串表示(结果)让您感到困惑 - 这不是服务器看到的内容.服务器在那里看到一个变量.

因此,您需要使用带有字符串的语法(可以是变量或文字)并将其转换为间隔.例如?::INTERVALCAST(? AS INTERVAL).

因此,这不是一个错误.

  • 非常感谢!`ps = connection.prepareStatement("SELECT current_timestamp + ?::INTERVAL;");` 这按预期工作,可惜我买的 JSP 书中没有记录:) (2认同)