ORA-01002: 提取乱序
Posted
技术标签:
【中文标题】ORA-01002: 提取乱序【英文标题】:ORA-01002: fetch out of sequence 【发布时间】:2014-12-29 17:37:57 【问题描述】:我得到 org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; SQL 的未分类 SQLException
UPDATE responses
SET version_no = ( version_no + 1 ),
read_status = 0,
tslastmodified = SYSDATE
WHERE responseid IN (SELECT responseid
FROM responses
WHERE read_status = 1
AND tslastmodified < SYSDATE - 45 / ( 24 * 60 )
AND id IN (SELECT id
FROM emp))
; SQL状态[24000];错误代码[1002]; ;嵌套异常是 java.sql.SQLException: ORA-01002: fetch out of sequence
JAVA代码:
getJdbcTemplate().queryForObject(SurveyQuery.UPDATE_INPROCESS, Integer.class);
请让我知道上述查询中有什么问题
【问题讨论】:
【参考方案1】:您可以将UPDATE
语句修改为如下所示
UPDATE RESPONSES SET VERSION_NO=(VERSION_NO+1),
READ_STATUS=0,
TSLASTMODIFIED = SYSDATE
WHERE READ_STATUS = 1
AND TSLASTMODIFIED < SYSDATE - 45/(24*60)
AND EXISTS (SELECT 1 FROM EMP
WHERE RESPONSES.ID = EMP.ID)
注意:虽然您可以使用上述修改后的查询,但我怀疑上述错误是由于发布的更新语句造成的。从Documentation看来,上述错误的原因可能是
当您在所有记录都完成后对活动游标执行 FETCH 已取走。
(或)
当您在 COMMIT 之后对 SELECT FOR UPDATE 执行 FETCH 时 已发布。
【讨论】:
想知道你写的更新查询是否比第一个更高效 应该是因为在您的查询中您使用了 2 个子查询,其中一个是不必要的。自己测试一下看看。 您的重写避免了从被更新的表中驱动的子查询。我也无法理解这将如何引发 ORA-01002,但我们还没有看到 Spring/Hibernate 代码,所以我们不知道它在锁定或事务管理方面的尝试。 我很好奇你为什么用getJdbcTemplate().queryForObject
而不是getJdbcTemplate().update
以上是关于ORA-01002: 提取乱序的主要内容,如果未能解决你的问题,请参考以下文章