Oracle存储过程返回结果集,什么时候关闭游标Cursor

时间:2022-08-03 16:02:33
.net调用 Oracle 的存储过程,返回结果集DataTable,需要用到游标Cursor,
Open OutCursor For Select * From Sys_User;


请问游标在什么时候关闭,
如果接着在存储过程里面关闭, .net程序会报 ORA-24338: 未执行语句句柄
难道只能在net程序中关闭connection的时候,游标才被关闭吗?

请各位高手给予解释
谢谢

29 个解决方案

#1


 游标的使用一般就是: 声明游标-> 打开游标->提取数据->关闭游标。 
过程里使用完关闭即可。

#2


引用 1 楼 yjytiantang 的回复:
游标的使用一般就是: 声明游标-> 打开游标->提取数据->关闭游标。 
过程里使用完关闭即可。


兄弟我不需要提取数据啊,我是直接返回一个输出out的游标参数
在存储过程里面,手动关闭游标,net里面会报错,得不到结果集

#3


循环结束后,就把游标关掉。end loop 这后

#4


各位,我这个只要取结果集,不需要循环
存储过程代码如下
CREATE OR REPLACE Procedure GetUserData(Data_Cursor out pkg_Tool.CursorType) --返回out一个游标类型的参数
 Is
 Begin
   Open Data_Cursor for 'Select * From Sys_User';
   --这里不需要循环什么,我只要取整个结果集
   --Close Data_Cursor; --如果这里关闭游标的话.net程序取不到结果集。
 End GetUserData;


关闭游标被我注释了,如果不注释的话,Net程序就要取不到结果集

#5


提取完数据操作,关闭游标的,以释放占用系统资源.

#6


提取完数据操作,关闭游标的,以释放占用系统资源.

#7


怎么没有人知道吗

都没有测试过吗,什么时候才关闭游标

有没有什么测试工具测试游标的关闭情况

#8


以往开发时,返回数据集后游标也是不关的,可能是依靠ORACLE或.NET的自动回收机制吧

#9


楼上说了一句经验之谈,我也是同感,不能手动在过程里面关闭,现在就是不知道这个自动关闭原理,机制,怕浪费资源,最好有这方面的测试用例

#10


楼上说了一句经验之谈,我也是同感,不能手动在过程里面关闭,现在就是不知道这个自动关闭原理,机制,怕浪费资源,最好有这方面的测试用例

#11


在调用的。net或者java里关闭
。net里我忘记怎么关了,java里,游标对象。close就行了

#12


我也是这样的,在应用程序里面关闭连接,释放资源。

主要是没什么官方的文档说明,

另外oracle的游标数量也是有限制的,随说最大值可该

但是总是担心会耗尽所有游标

#13


.net的封装的ADO.net相关类会自动释放资源关闭游标

#14


楼上说的是,也只能解释为abo.net在connection.close()的时候,里面的机制自动释放游标资源

这方面的资料比较少,也没有官方的文档说明

#15


直接close 游标名就可以了

#16


凡是说,在存储过程里面直接close cursor的,都没有编写程序调用的实际经验

关键是在存储过程里面close的话,存储过程就不会放回结果集给程序了

#17


在外部程式调用时,不能直接关闭游标, 估计是一种委托管理机制吧, .net中是在close connection时释放的.

#18


你直到使用游标操作数据完成之后 ,在把游标close掉.

#19


其实不需要专门定义close cursor , 在遇到end时会自动关闭

#20


引用 19 楼 zzll1112 的回复:
其实不需要专门定义close cursor , 在遇到end时会自动关闭


请问楼上的朋友,有证明的机制吗

#21


不过以个人认为应该是在程序方面、
ado.net的对象里面关闭的

如果在存储过程里面关闭的话,ado.net就得不到结果集

#22


你的Open OutCursor For Select * From Sys_User;在哪执行的呀。
一般情况下,你上面这句和关闭游标的那句话,要放在同一段里执行,要不然就会出现问题。

建议是在存储过程里,把打开游标和关闭游标都写上。

#23


引用楼主 kingcsx666 的回复:
.net调用 Oracle 的存储过程,返回结果集DataTable,需要用到游标Cursor,

SQL code
Open OutCursor For Select * From Sys_User;


请问游标在什么时候关闭,
如果接着在存储过程里面关闭, .net程序会报ORA-24338: 未执行语句句柄,
难道只能在net程序中关闭connection的时候,游标才被关……


呵呵,人家都说了,如果在过程中中关闭游标,调用时会报错?你用定义回答别人问题?

#24


我前几天也遇到过,在过程中关闭,java程序会报错!最后只有不关闭!

#25


引用 24 楼 gs_zhaoyang 的回复:
我前几天也遇到过,在过程中关闭,java程序会报错!最后只有不关闭!


楼上的才是真正测试过,有用过的人
没测试过的不要感觉说话
谢谢各位

#26


 总结:

如果要返回参数游标的话,不要在存储过程里面关闭游标
否则,应用程序是得不到存储过程的返回值

#27


还有一点貌似不同,java中用类直接调用可以,ibatis中调用就要返回这个游标才行(我做的时候是这样的,之前我没有返回他就给我报错,返回就好了,而用jdbc方式没有返回竟然都刻意 ,觉得有点不太理解)

#28


程序里边通过对CallableStatement对象的close释放游标资源

#29


.net里没有这个游标的对应句柄吗?没有相应对象吗?没有关闭的方法吗?

Java里这种游标用ResultSet获取,遍历之后直接关闭ResultSet,就是close cursor。

#1


 游标的使用一般就是: 声明游标-> 打开游标->提取数据->关闭游标。 
过程里使用完关闭即可。

#2


引用 1 楼 yjytiantang 的回复:
游标的使用一般就是: 声明游标-> 打开游标->提取数据->关闭游标。 
过程里使用完关闭即可。


兄弟我不需要提取数据啊,我是直接返回一个输出out的游标参数
在存储过程里面,手动关闭游标,net里面会报错,得不到结果集

#3


循环结束后,就把游标关掉。end loop 这后

#4


各位,我这个只要取结果集,不需要循环
存储过程代码如下
CREATE OR REPLACE Procedure GetUserData(Data_Cursor out pkg_Tool.CursorType) --返回out一个游标类型的参数
 Is
 Begin
   Open Data_Cursor for 'Select * From Sys_User';
   --这里不需要循环什么,我只要取整个结果集
   --Close Data_Cursor; --如果这里关闭游标的话.net程序取不到结果集。
 End GetUserData;


关闭游标被我注释了,如果不注释的话,Net程序就要取不到结果集

#5


提取完数据操作,关闭游标的,以释放占用系统资源.

#6


提取完数据操作,关闭游标的,以释放占用系统资源.

#7


怎么没有人知道吗

都没有测试过吗,什么时候才关闭游标

有没有什么测试工具测试游标的关闭情况

#8


以往开发时,返回数据集后游标也是不关的,可能是依靠ORACLE或.NET的自动回收机制吧

#9


楼上说了一句经验之谈,我也是同感,不能手动在过程里面关闭,现在就是不知道这个自动关闭原理,机制,怕浪费资源,最好有这方面的测试用例

#10


楼上说了一句经验之谈,我也是同感,不能手动在过程里面关闭,现在就是不知道这个自动关闭原理,机制,怕浪费资源,最好有这方面的测试用例

#11


在调用的。net或者java里关闭
。net里我忘记怎么关了,java里,游标对象。close就行了

#12


我也是这样的,在应用程序里面关闭连接,释放资源。

主要是没什么官方的文档说明,

另外oracle的游标数量也是有限制的,随说最大值可该

但是总是担心会耗尽所有游标

#13


.net的封装的ADO.net相关类会自动释放资源关闭游标

#14


楼上说的是,也只能解释为abo.net在connection.close()的时候,里面的机制自动释放游标资源

这方面的资料比较少,也没有官方的文档说明

#15


直接close 游标名就可以了

#16


凡是说,在存储过程里面直接close cursor的,都没有编写程序调用的实际经验

关键是在存储过程里面close的话,存储过程就不会放回结果集给程序了

#17


在外部程式调用时,不能直接关闭游标, 估计是一种委托管理机制吧, .net中是在close connection时释放的.

#18


你直到使用游标操作数据完成之后 ,在把游标close掉.

#19


其实不需要专门定义close cursor , 在遇到end时会自动关闭

#20


引用 19 楼 zzll1112 的回复:
其实不需要专门定义close cursor , 在遇到end时会自动关闭


请问楼上的朋友,有证明的机制吗

#21


不过以个人认为应该是在程序方面、
ado.net的对象里面关闭的

如果在存储过程里面关闭的话,ado.net就得不到结果集

#22


你的Open OutCursor For Select * From Sys_User;在哪执行的呀。
一般情况下,你上面这句和关闭游标的那句话,要放在同一段里执行,要不然就会出现问题。

建议是在存储过程里,把打开游标和关闭游标都写上。

#23


引用楼主 kingcsx666 的回复:
.net调用 Oracle 的存储过程,返回结果集DataTable,需要用到游标Cursor,

SQL code
Open OutCursor For Select * From Sys_User;


请问游标在什么时候关闭,
如果接着在存储过程里面关闭, .net程序会报ORA-24338: 未执行语句句柄,
难道只能在net程序中关闭connection的时候,游标才被关……


呵呵,人家都说了,如果在过程中中关闭游标,调用时会报错?你用定义回答别人问题?

#24


我前几天也遇到过,在过程中关闭,java程序会报错!最后只有不关闭!

#25


引用 24 楼 gs_zhaoyang 的回复:
我前几天也遇到过,在过程中关闭,java程序会报错!最后只有不关闭!


楼上的才是真正测试过,有用过的人
没测试过的不要感觉说话
谢谢各位

#26


 总结:

如果要返回参数游标的话,不要在存储过程里面关闭游标
否则,应用程序是得不到存储过程的返回值

#27


还有一点貌似不同,java中用类直接调用可以,ibatis中调用就要返回这个游标才行(我做的时候是这样的,之前我没有返回他就给我报错,返回就好了,而用jdbc方式没有返回竟然都刻意 ,觉得有点不太理解)

#28


程序里边通过对CallableStatement对象的close释放游标资源

#29


.net里没有这个游标的对应句柄吗?没有相应对象吗?没有关闭的方法吗?

Java里这种游标用ResultSet获取,遍历之后直接关闭ResultSet,就是close cursor。