超出打开游标的最大数,该如何处理

超出打开游标的最大数,该如何处理,第1张

处理超出打开游标的最大数异常:\x0d\在执行如下代码时,经常会出现ora-01000: maximum open cursors exceeded异常\x0d\for(int i=0;i show parameter open_cursors;\x0d\NAME TYPE VALUE\x0d\------------------------------------ ----------- ---------------\x0d\open_cursors integer 1000\x0d\\x0d\重要的是将 OPEN_CURSORS 的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS 指定的数量(即设置的值高于实际需要的值), 也不会增加系统开销。\x0d\2 获取打开的游标数。\x0d\下面的查询按降序显示用户“SCOTT”为每个会话打开的游标数。\x0d\SQL> select osid, osuser, machine, count() num_curs\x0d\2 from v$open_cursor o, v$session s\x0d\3 where user_name = 'SCOTT' and osid=ssid\x0d\4 group by osid, osuser, machine\x0d\5 order by num_curs desc;\x0d\SID OSUSER MACHINE NUM_CURS\x0d\-----------------------------------------------------\x0d\217 m1 1000\x0d\96 m2 10\x0d\411 m3 10\x0d\50 test 9\x0d\请注重,v$open_cursor 可以跟踪会话中 PARSED 和 NOT CLOSED 的动态游标(使用 dbms_sqlopen_cursor() 打开的游标)。它不会跟踪未经分析(但已打开)的动态游标。在应用程序中使用动态游标并不常见。本模式的前提是未使用动态游标。\x0d\3 获取为游标执行的 SQL。\x0d\使用在以上查询结果中找到的 SID 运行下面的查询:\x0d\SQL> select qsql_text\x0d\2 from v$open_cursor o, v$sql q\x0d\3 where qhash_value=ohash_value and osid = 217;\x0d\SQL_TEXT\x0d\select from empdemo where empid='212'\x0d\select from empdemo where empid='321'\x0d\select from empdemo where empid='947'\x0d\select from empdemo where empid='527'\x0d\\x0d\结果将显示正在连接上执行的查询。它提供了一个入手点,让您可以反向跟踪到打开游标的来源。\x0d\\x0d\这样的错误很轻易出现在java代码中的主要原因是:Java代码在执行conncreateStatement()和connprepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,假如你的createStatement和prepareStatement是在一个循环里面的话,就会非常轻易出现这个问题。因为游标一直在不停的打开,而且没有关闭。\x0d\一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,假如不需要使用结果集(ResultSet)的数据,就马上将Statement或PreparedStatement关闭。\x0d\对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。\x0d\而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常非凡的要求。\x0d\假如你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。\x0d\但是假如你使用连接池,那么请注重,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库答应的最大值”的错误,导致程序无法正常访问数据库。\x0d\正确的代码,如下所示:\x0d\for(int i=0;i回答于 2022-12-24

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。主语言是面向记录的,一组主变量一次只能存放一条记录。仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式。在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?这时我们就会使用游标。

-----------------------------------------------------------

使用游标会降低执行效率,平时尽可能不要用

declare @column1 varchar(10)

declare @column2 varchar(10)

declare cursor1 cursor for select column1, column2 from tablename --声明游标(用select语句,可以通过where等语句限定游标取的结果集)

open cursor1 --打开游标

fetch next from cursor1 into @column1, @column2 --取游标的值到变量

while (@@fetch_status=0) --有记录的话

begin

--处理

fetch next from cursor1 into @column1, @column2 --取下一个

end

close cursor1 --关闭游标

deallocate cursor1 --释放游标

在一个游标关闭后,如果没有重新打开,则不能使用它。但是,使用声明过的游标不需要再次声明,用OPEN语句打开它就可以了。

游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。不像多数DBMS,MySQL游标只能用于存储过程(和函数)。

cursor mysursor is select from table;

open mysursor;

就这样打开了。

然后你就去取里面的数据进行自己需要的 *** 作即可。

建议:一次性读取所有数据表项,转换成matlab内部的数据格式。

然后用纯matlab的方法解决,比如上述的查找 *** 作,其实用matlab写也不难。

而且这样可以避免多次访问数据库。

以上就是关于超出打开游标的最大数,该如何处理全部的内容,包括:超出打开游标的最大数,该如何处理、数据库的游标的作用是什么,如何编写、sql游标循环里一定不能打开游标吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9370316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存