plsql游标最后一行重复的问题,plsql游标一行重复
大家仔细看一下,下面第一个存储过程,test01,有没问题? 看似没问题,其实会造成重复行,test02将exit when的语句放到合适的位置上来。就不会出现最后一行重复打印的问题。create or replace procedure test01 as cursor cursor1 is select * from v$session where rownum <= 5; record1 cursor1%rowtype; begin DBMS_OUTPUT.ENABLE(buffer_size => null); open cursor1; loop fetch cursor1 into record1; dbms_output.put_line(record1.sid); exit when cursor1%notfound; end loop; close cursor1; end;
----------------------------------------------------------------------- create or replace procedure test02 as cursor cursor1 is select * from v$session where rownum <= 5; record1 cursor1%rowtype; begin DBMS_OUTPUT.ENABLE(buffer_size => null); open cursor1; loop fetch cursor1 into record1; exit when cursor1%notfound; dbms_output.put_line(record1.sid); end loop; close cursor1; end;
open那不会浪费太多时间。需要的时间就是两部分。
1.定义游标,获取结果集的时候。---这个时间主要看你的sql查询需要多长时间。
2.Loop的时候。----这个就是运行的时间了。
不过建议大量数据的话不要用游标来处理。
游标的处理速度是很慢的。效率比较低。最好能做批量处理。
我以前用游标做过数据处理,我那个业务逻辑比较复杂,每小时大概只能处理几十万数据。效率太低了。后来我都改成多步骤,用insert into select 。。from 这类的写法去处理,能差百八十倍的速度。
将fetch next from mycursor into @i,@name
放在while循环体的最后即可,即:
while(@fetch_status=0)
begin
print 'id: '+@i+ ' name: '+@name
fetch next from mycursor into @i,@name
end
这样应该就可以了。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。