博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java调用oracle存储过程,报错SQLException :Cursor is closed
阅读量:4097 次
发布时间:2019-05-25

本文共 907 字,大约阅读时间需要 3 分钟。

背景描述

工作中使用Spring-Boot + Mybatis 的架构编写web服务时,使用Mapper调用Oracle里的存储过程查询业务数据。

问题描述

在查询调试时,遇到JAVA后台调用Oracle后报错SQLException :Cursor is closed,尝试了几种场景,总结如下:

  1. 存储过程中有报错时 ,包括校验或其他非预期异常,会报错Cursor is closed;
  2. 当本身查询不到数据时,不会报错,正常返回空集合

问题分析

查阅资料后,发现游标分为显示游标和隐示两种

  • 显示游标是指在存储过程中明确声明出来的游标,如下方示例o_cursor。显示游标需要在SQL中显示使用CLOSE 游标名关闭。

PROCEDURE XXXX

(
i_input1 IN varchar2(30),
i_input2 IN varchar2(30),
o_cursor OUT CURSOR
)

  • 隐示游标是指由数据库自动使用的用于SQL语句的内部游标,我们常用到的SELECT…INTO…查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。隐示游标自动关闭。

本次遇到的是在Oracle存储过程中显示定义的显示游标的开关问题,那么首先需要找到遇到异常时显示关闭游标()的地方,但很遗憾没有找到;

那么接着找打开游标的地方,发现只有在存储过程最后,查找到数据后才将游标显示打开,那么当出现SQL异常或者在查询到数据之前的校验异常导致程序退出,并没有显示打开,那么遇到Cursor is closed也就能够理解了。

问题解决方案

  • 使用JAVA代码实现一遍存储过程中的错误检查,将错误检查前移。保证除开运行时异常,其他的都不会因为异常导致存储过程提前结束从而游标未开
  • 修改存储过程,在所有检查异常的处理里加上 OPEN xxx for select 1 from dual; 返回一个空游标

参考文献

参考文章

[1]: https://www.cnblogs.com/heshan664754022/archive/2013/05/22/3092437.html

你可能感兴趣的文章
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>
React Native之原理浅析
查看>>
Git操作清单
查看>>
基础算法
查看>>
前端面试
查看>>
Flutter Boost的router管理
查看>>
react-native-wechat
查看>>
基于云信的react-native聊天系统
查看>>
网易云音乐移动客户端Vue.js
查看>>
ES7 await/async
查看>>
ES7的Async/Await
查看>>
React Native WebView组件实现的BarCode(条形码)、(QRCode)二维码
查看>>
每个人都能做的网易云音乐[vue全家桶]
查看>>
Vue2.0全家桶仿腾讯课堂(移动端)
查看>>
React+Redux系列教程
查看>>
19 个 JavaScript 常用的简写技术
查看>>
iOS应用间相互跳转
查看>>