oracle游标速度很慢,oracle程序性能优化实录-关于游标打开超出最大数限制

关于游标打开超出最大数限制,两个地方需要注意:

1、oracle程序包中,一般返回值是cursor,这个不用关闭。

但是中间用到的cursor必须关闭。如下例子:

open result_cursor for sql_statement;

loop

fetch

result_cursor into

v_HouseCode,v_STD,v_DEN,v_type,p_latefee_type;

exit when

result_cursor%notfound;

end loop;

close result_cursor;(这句必须有)

2、; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;">都都必须即时关闭。

以下为四个例子:

(1)以下写法不对:

Statement

stmt = null;

for(int

i=0;i<10;i++){

stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet rs=stmt.executeQuery(sqlStr);

}

stmt.close();

正确的写法应该是:

Statement

stmt = null;

for(int

i=0;i<10;i++){

stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet rs=stmt.executeQuery(sqlStr);

stmt.close();

}

(2)以下写法不对:

PreparedStatement pstInsert = null;

try{

pstInsert = conn.prepareStatement(sqlStr);

}catch(Exception e){}

正确的写法应该是:

PreparedStatement pstInsert = null;

try{

pstInsert = conn.prepareStatement(sqlStr);

}catch(Exception e){

}finally{

try{

if(pstInsert!=null)

pstInsert.close();

}catch(Exception ee){}

}

(3)以下写法不对:

CallableStatement spStat = null;

spStat =

conn.prepareCall(sqlStr);

spStat.registerOutParameter(1,OracleTypes.CURSOR);

spStat.execute();

正确的写法应该是:

CallableStatement spStat = null;

spStat =

conn.prepareCall(sqlStr);

spStat.registerOutParameter(1,OracleTypes.CURSOR);

spStat.execute();

ResultSetrs =

(ResultSet)spStat.getObject(1);(关闭程序包返回的cursor,必不可少)

rs.close();

spStat.close();

(4)以下写法不对:

Statement

stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet

rs=stmt.executeQuery(sqlStr);

while(rs.next){

}

正确的写法应该是:

Statement

stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ResultSet

rs=stmt.executeQuery(sqlStr);

while(rs.next){

}

rs.close();

stmt.close();

3、一旦出现该错误,一般是在;">中无法快速定位,检测方法为:

selectq.sql_text

from v$open_cursor o, v$sql q

where q.hash_value=o.hash_value

order by q.sql_text;

执行上述的sql语句,查看执行次数特别多的sql语句,然后就能反向追踪,定位到发生问题的;">类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值