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: 提取乱序的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01002: 提取乱序

ListAgg() ORA-01002: 提取乱序

提取序列 <ora-01002> 回滚

ORA-01002: 提取过程中的顺序不正确

pl/sql 存储函数 ora-01002 无序获取 SIMPLE

scrapy爬下来的数据是乱序的,如何排序?