前言

近期通过程序调用存储过程,在获取结果的时候报错提示 java.sql.SQLException: ORA-01002: 提取违反顺序 ,本文对其原因及处理方法进行记录。


一、背景:

通过java 程序调用Oracle 存储过程,并获取存储过程返回的记录数(count)和 结果集;

二、现象:

在程序中设置完入参后,调用存储过程,可以取得 结果集的count 数量,但是无法获取结果集合 ,提示: java.sql.SQLException: ORA-01002: 提取违反顺序。但是在数据库执行是可以拿到结果集的count 数量和结果集合。

2.1 报错展示:

在这里插入图片描述

2.2 存储过程 :

存储过程out参数:
在这里插入图片描述其中 O_COUNT 获取到结果集合的长度并进行数字返回;
O_RESULT 从临时表中获取本次的结果集合进行返回;

三、原因解析:

因为返回的结果集合是从临时表中获取的数据,而这个临时表在当次事务提交之后,删除临时表本次回话的数据。

临时表中设置了提交删除:
在这里插入图片描述
而在程序执行开始时,并没有将事务的自动提交设置为false ,导致在调用存储过程之后,自动提交了事务,进而导致临时表数据被删除,从而无法获取到集合数据。
在这里插入图片描述而通过事务调用的,会在获取连接的时候关闭自动提交,在整个程序方法调用完成自动提交事务:
在这里插入图片描述
所以要以事务的方式进行存储过程的调用。

四、处理方式:

在类或者方法中增加@Transactional(rollbackFor = Throwable.class) 注解,使得以事务的方式执行sql。
在这里插入图片描述


总结

java程序调用存储过程,获取out 的参数提示 java.sql.SQLException: ORA-01002: 提取违反顺序 原因及处理进行分析。

更多推荐