sql - ORA-14763 : Unable to resolve FOR VALUES clause to a partition number

标签 sql oracle jdbc database-partitioning

我每天都对我的表进行分区。

表名我的表 列名 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/

相关文章:

java - 如何解决 Java EE 不良做法 : Direct Management of Connections

mysql - 优化此 MySQL 查询,删除另一个表中缺少的行

sql - 删除 SQL 中 created_at 的毫秒部分以与其他日期时间进行比较

sql - 雪花。如何检查子数组是否存在于另一个数组中?

sql - 如何查找违反外键约束的记录

java - 从 NetBeans 插入 Access 数据库

java - 如何将 ResultSet 转换成有用的整数?

sql - 如何优化 Django 生成的这个非常慢的查询?

oracle - JMeter:Oracle 12C 中如何处理隐式结果? ORA-20999: Oracle ERROR::ORA-29478: 无法通过此语句返回隐式结果

Oracle 从主表填充备份表