在通过JPA方式call store procedure的时候,可能出现java.sql.SQLException: ORA-01002: fetch out of sequence 错误。原因大概如下:
当多次执行相同的SQL语句,然后以不同的顺序获取结果集时,可能会出现此错误。这是因为Oracle数据库为每个结果集维护了一个预期的获取顺序(fetch sequence),当实际获取结果的过程与预期的顺序不一致时,就会抛出此错误。
当你在一次查询中从同一个预处理语句(PreparedStatement)或普通Statement获取结果集,然后尝试以不同的顺序获取行时,也可能会导致这个错误。
解决办法就是设置conn.setAutoCommit(false);即可
在使用了conn.setAutoCommit(false);之后,如果我们的代码中是存在连续调用存储过程的情况,这个时候会出现一个问题,那就是上一次的调用结果会出现在下一次的调用中,导致错误。这是由于commit功能被手动false导致的。这个时候我们需要在每次调用结束之后手动去commit或rollback。
比如在我们进行自动化测试时,每个测试用例都会去调用存储过程获取数据库返回的数据,这个时候在所有用例执行前,首先进行了conn.setAutoCommit(false);设置。然后在每个用例执行之后完成如下设置: