我正在学习Oracle 12 C的新功能(前N个查询和分页)。我尝试了一些使用offset和fetch关键字的例子,当我使用sql developer时它运行良好。我尝试使用Spring jdbcTemplate实现相同的功能,我发现了一个奇怪的行为。 例如:以下是代码段:
// get first ten entities
String query = "SELECT * FROM ENTITY E order by E.ID offset ? rows fetch next ? rows only";
SqlRowSet rowSet = this.jdbcTemplate.queryForRowSet(query, 1, 10);
while(rowSet.next()){
//do something
}
Spring抛出异常:
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;错误的SQL语法[SELECT * FROM ENTITY E 按E.ID偏差排序?行获取下一个?仅行];嵌套异常 是:错误:语法错误在或接近" $ 2"
我在postgres数据库上尝试了一些相同的东西,但没有运气,最后我考虑删除参数,当我删除第三个参数并在查询字符串中设置硬编码值时它起作用.ex:
"SELECT * FROM ENTITY E order by E.ID offset ? rows fetch next 10 rows only"
是否不允许在fetch子句中使用bind参数?
答案 0 :(得分:1)
如果你在fetch参数上添加(),它可以正常工作:
String query = "SELECT * FROM ENTITY E order by E.ID offset ? rows fetch next (?) rows only";