我每天都对我的表进行分区。
表名我的表 列名 IN_TIME 时间戳
我想获取最近 2 天分区的行。 我正在使用以下查询。
SELECT * FROM MY_TABLE PARTITION FOR (TO_DATE('17-DEC-2017','DD-MON-YYYY'))
UNION
SELECT * FROM MY_TABLE PARTITION FOR (TO_DATE('18-DEC-2017','DD-MON-YYYY'))
我正在尝试使用准备好的语句设置日期
preparedStatement.setString(1, "17-DEC-2017");
preparedStatement.setString(2, "18-DEC-2017");
但我得到异常“Caused by: java.sql.SQLException: ORA-14763: Unable to resolve FOR VALUES clause to a partition number”
请建议任何更好的方法来做到这一点。
最佳答案
绑定(bind)变量适用于值,但不能用于动态选择对象,例如表、 View 或分区。在条件中使用绑定(bind)变量,希望进行分区修剪,或者为每个查询创建一个字符串。
当您考虑时,绑定(bind)变量限制是有道理的。解析查询可能是一项艰巨的工作 - 检查安全性、构建执行计划等。使用绑定(bind)变量可以让 Oracle 在下一个查询仅包含不同的文字时重新使用大部分工作。但如果表名不同,则它必须放弃所有工作并完全重新解析语句。所以在那种情况下绑定(bind)变量没有任何好处。
有了分区,似乎可能会有好处。分区只是表的一部分。权限不会改变,因此 Oracle 似乎可以通过允许绑定(bind)变量来节省一些工作。但是,有些对象可能因分区而异。例如,可以创建仅存在于某些分区上的索引。在这种情况下,一个分区的执行计划可能不适用于另一个分区。
(您仍然可以证明绑定(bind)变量分区名称可能很有用。Oracle 具有一些动态执行计划功能,例如 FILTER 操作和自适应重新优化。因此它可以创建一个智能计划适应不同的分区。但它不会。)
幸运的是,分区修剪通常与指定分区值一样有效。将查询更改为此应该运行得同样快:
select * from my_table where some_date > trunc(:date_2_days_ago);
但是使用分区意味着从表中检索大部分行。在这种情况下,查询解析时间可能无关紧要。如果一个查询需要一分钟来处理,那么查询解析时间是 0.02 秒而不是 0.01 秒真的重要吗?如果是这种情况,那么硬编码的 SQL 语句也可以正常工作。
关于sql - ORA-14763 : Unable to resolve FOR VALUES clause to a partition number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879933/