.net调用 Oracle 的存储过程,返回结果集DataTable,需要用到游标Cursor,
Open OutCursor For Select * From Sys_User;请问游标在什么时候关闭,
如果接着在存储过程里面关闭, .net程序会报ORA-24338: 未执行语句句柄
难道只能在net程序中关闭connection的时候,游标才被关闭吗?请各位高手给予解释
谢谢

解决方案 »

  1.   

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

  2.   


    兄弟我不需要提取数据啊,我是直接返回一个输出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.   

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

  6.   

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

  7.   

    我也是这样的,在应用程序里面关闭连接,释放资源。主要是没什么官方的文档说明,另外oracle的游标数量也是有限制的,随说最大值可该但是总是担心会耗尽所有游标
      

  8.   

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

  9.   

    楼上说的是,也只能解释为abo.net在connection.close()的时候,里面的机制自动释放游标资源这方面的资料比较少,也没有官方的文档说明
      

  10.   

    直接close 游标名就可以了
      

  11.   

    凡是说,在存储过程里面直接close cursor的,都没有编写程序调用的实际经验关键是在存储过程里面close的话,存储过程就不会放回结果集给程序了
      

  12.   

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

  13.   

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

  14.   

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

  15.   

    不过以个人认为应该是在程序方面、
    ado.net的对象里面关闭的如果在存储过程里面关闭的话,ado.net就得不到结果集
      

  16.   

    你的Open OutCursor For Select * From Sys_User;在哪执行的呀。
    一般情况下,你上面这句和关闭游标的那句话,要放在同一段里执行,要不然就会出现问题。建议是在存储过程里,把打开游标和关闭游标都写上。
      

  17.   

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

  18.   

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

  19.   

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

  20.   

    .net里没有这个游标的对应句柄吗?没有相应对象吗?没有关闭的方法吗?Java里这种游标用ResultSet获取,遍历之后直接关闭ResultSet,就是close cursor。