存储过程中如何不用游标,遍历记录

如题所述

游标一般用于把通过脚本得到的结果集的内容在用于其它的SQL语句中。但是游标执行会影响脚本执行速度,所以使用时请慎重。 在存储过程或触发器中使用 SQL 游标的典型过程为: 声明SQL 变量包含游标返回的数据。为每个结果集列声明一个变量。声明足够大的变量来保存列返回的值,并声明变量的类型为可从列数据类型隐式转换得到的数据类型。
使用 DECLARE CURSOR 语句将 SQL 游标与 SELECT 语句相关联。另外,DECLARE CURSOR 语句还定义游标的特性,例如游标名称以及游标是只读还是只进。
使用 OPEN 语句执行 SELECT 语句并填充游标。
使用 FETCH INTO 语句提取单个行,并将每列中的数据移至指定的变量中。然后,其他 SQL 语句可以引用那些变量来访问提取的数据值。SQL 游标不支持提取行块。
使用 CLOSE 语句结束游标的使用。关闭游标可以释放某些资源,例如游标结果集及其对当前行的锁定,但如果重新发出一个 OPEN 语句,则该游标结构仍可用于处理。由于游标仍然存在,此时还不能重新使用该游标的名称。DEALLOCATE 语句则完全释放分配给游标的资源,包括游标名称。释放游标后,必须使用 DECLARE 语句来重新生成游标。
请采纳。
温馨提示:内容为网友见解,仅供参考
无其他回答

存储过程中用什么可以替代游标
一般说来,当操作的数据超过1万条时,就避免用游标吧。为了测试游标性能,写了下面一个游标对IDC_Gather_Info表中数据进行遍历 下面是当表中数据分别为15万、5万、1万时游标的表现:1.数据量15万,存储过程执行失败,提示错误:Incorrect key file for table '\/tmp\/#sql_3044_0.MYI';try to rep...

逐条处理记录,不使用游标,有什么方法
如果是c#、java,可以把数据取到本地放到数据集或者记录集里面,然后一条一条处理。如果是存储过程,那么用游标是比较方便的;否则可以考虑明确好查询条件(未处理的条件),排序规则,每次只查询一条(sqlserver的top,oracle的rownum<=1),经过n多次查询,来处理。

存储过程,如果不用游标,可以用什么代替
少用游标。尽量用一条sql语句代替。或者用多条SQL语句分批处理。有时间多看看开窗语句,很实用。

在存储过程中,为了在一个结果集的记录中进行循环,除了用游标还能用其...
将临时表 换成表变量也可以 不用游标可以避免 游标的释放问题和游标重名的问题。如果只是为了速度 就无所谓了,游标的性能没有大家说的那么差,关键就看你怎么写就是了 没有环境,自己调整一下吧

6、什么是存储过程?什么是游标,何时使用、何时不用游标?
存储过程是一组命名了的SQL语句集合,是为了完成特定功能汇集而成的。该集合编译后存放在数据库中,可根据实际情况重新编译,可直接运行,也可远程运行且存储过程直接在服务器端运行。游标实际上是一种能从包括多条数据记录的结果集(结果集是select查询之后返回的所有行数据的集合)中每次提取一条记录的...

oracle中存储过程执行很长时间,用了三个游标。
不用看执行计划都知道慢了,for c1 for c2 for c3 这种没有任何条件的三重循环的时间复杂度为C1记录数*C2记录数*C3记录数,你得尽量减少循环次数,能用sql就不要用游标循环了

求oracle存储过程,同时删除两张表中的id相同的数据
手上没有环境,大概说一下我的方法,方法一(不用游标,变量,需要中间表):1.创建临时表(或者创建个表也可以,用一次删一次)即中间表。2.取出两个表相同的ID记录,将ID插入中间表 3.对应中间表中的id,删险两表中的记录。4.清除中间表 方法二(要用游标、变量):1.建立游标,用游标取出两表...

sqlserver存储过程可以遍历一个查询出来的结果集吗
select a.col_a,a.col_b from tab_A a open C_cursorname fetch next from C_cursorname into @var_col_a,@var_col_b while @@fetch_status!=0 begin --具体实现 fetch next from C_cursorname into @var_col_a,@var_col_b end --大致是这样的。但不推荐用游标,游标效率太低...

sql存储过程耗时太长
多长都有可能,40是很正常的。1.尽量优化语句,尽量少用游标。2.修改较为常用的表要注意,最好先在临时表中作好运算和其它处理,最后在修改这些表,以免较慢的存储过程长时间锁定表记录,影响数据正常使用。3.将连接超时和命令超时适当扩大,以免超时错误。

oracle存储过程游标使用疑问
你第一个存储过程可以这样写:create or replace procedure d_1 is begin for cur in (select * from t_t) ---这个cur是隐式游标,无需定义,直接使用。loop dbms_output.put_line(cur.name);end loop;end;\/ 2、使用的是标准的显式游标 a 定义游标---Cursor [Cursor Name] IS;b ...

相似回答