存储过程中用什么可以替代游标

存储过程代码如下:

CREATE OR REPLACE PROCEDURE pd_P_visitPlan_answer (sKeyid varchar2,
sVpid varchar2,
sVpcmid varchar2,
sVpctid varchar2,
sVpidid varchar2,
sAnswerType varchar2,
sReturnMsg out varchar2) is

type Type_Cur is ref cursor;
VisitPlanCur Type_Cur;
sSQL varchar2(500);
nNum number(4) default 1;--自动增长序号
sSequenceNum varchar2(20) default 0;--序号
sCondition varchar2(1000) default '';--用于拼接sql语句条件

sCnid varchar2(20);
sContent varchar2(200);
sIsupstandard varchar2(1);
iShoworder number(4,2);

rownum number(4);--记录行数量,用于变量赋值前,判断是否存在数据
sDefaultAnswer varchar2(2) default '0';
begin
--查询指标基本信息
sSQL := 'select cnid, content, isupstandard, showorder from cm_k_checkanswer t where t.keyid = ' || sKeyid;

open VisitPlanCur for sSQL;
loop
fetch VisitPlanCur
into sCnid,sContent,sIsupstandard,iShoworder;
exit when VisitPlanCur%notfound;
--生成序号
select to_char(sysdate,'yyMMddhh24miss') || replace(lpad(seq_visitplan.nextval,5),' ','0') || replace(lpad(nNum,3),' ','0') into sSequenceNum from dual;
nNum := nNum + 1;

--根据指标答案类型进行判断,当为文本时默认为空
if sAnswerType = '4' then
sDefaultAnswer := '';
end if;

--数据写入cm_p_visitplan_answer
insert into cm_p_visitplan_answer(vpanid, vpidid, cnid, content, isupstandard, showorder, answer, vpctid, vpcmid, vpid)
values(sSequenceNum,sVpidid,sCnid,sContent,sIsupstandard,iShoworder,sDefaultAnswer,sVpctid,sVpcmid,sVpid);

end loop;
close VisitPlanCur;

exception
when others then
if sReturnMsg ='' or sReturnMsg is null then
rollback;
sReturnMsg := ' 存储过程: pd_P_visitPlan_answer 错误 ' || sqlerrm;
end if;
end;

Mysql存储过程优化——使用临时表代替游标。

Mysql游标在操作小数据量时比较方便,效率可观,但操作大数据量,速度比较慢,甚至直接产生系统错误。

 一般说来,当操作的数据超过1万条时,就避免用游标吧。

 为了测试游标性能,写了下面一个游标对IDC_Gather_Info表中数据进行遍历

下面是当表中数据分别为15万、5万、1万时游标的表现:

 

1.数据量15万,存储过程执行失败,提示错误:Incorrect key file for table '/tmp/#sql_3044_0.MYI';try to repair it

2.数据量5万,执行成功,耗时31.051s

3.数据量1万,执行成功,耗时1.371s

 

下面使用临时表替换游标:

1.数据量15万,执行成功,耗时8.928s

2.数据量5万,执行成功,耗时2.994s

3.数据量1万,执行成功,耗时0.634s

 

可以看到Mysql的游标在处理大一点的数据量时还是比较乏力的,仅适合用于操作几百上千的小数据量。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-26
在sql server 里可以用 临时表,表变量等 .
可以将复合条件的记录都插入到临时表,然后再用 update 等语句对临时表进行计算.
最后将临时表的数据插入到正式表.

其实你这个需求 ,是可以不用触发器的.
多写几个 insert ,update 就是了.本回答被提问者和网友采纳
第2个回答  2012-09-24
可以用集合 批量绑定来 替换游标的
第3个回答  2012-09-25
没有吧,除非你自己开发一种新存储过程来替代游标的功能
第4个回答  2012-09-24
没有吧,除非你自己开发一种新存储过程来替代游标的功能

存储过程中用什么可以替代游标
Mysql存储过程优化——使用临时表代替游标。Mysql游标在操作小数据量时比较方便,效率可观,但操作大数据量,速度比较慢,甚至直接产生系统错误。一般说来,当操作的数据超过1万条时,就避免用游标吧。为了测试游标性能,写了下面一个游标对IDC_Gather_Info表中数据进行遍历 下面是当表中数据分别为15万、5...

如何替代游标pg
1、在PostgreSQL中,PL\/pgSQL函数是一种存储过程语言,可以用来代替游标的使用。2、查询重写是一种技术,通过将原始SQL查询转换为另一种形式的查询,可以避免使用游标。3、在处理大量数据时,我们可以将查询结果存储在一个数组中,使用数组索引来访问特定行。4、可以将查询结果插入到一个临时表中,使用SEL...

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

在存储过程中,为了在一个结果集的记录中进行循环,除了用游标还能用其...
临时表 或表变量都可以 例如:sqlserver数据库,你的结果集为 T_Table if object_id('tempdb..#tmp') > 0 drop table #tmp declare @ID int select identity(int,1,1) as ID,* from T_Table select @ID = 1 while Exists(select * from #tmp)begin select @变量 = 字段 from #tmp ...

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

现在的数据库开发还经常用到游标吗?
一般的,你可以使用如下两个方法去解决使用游标这个矛盾:一是尽量将语句,通过sql原生代码去生成结果集 二是可以使用%ROWTYPE;这些语句去作为变量 当然,在结果集输出的时候,用游标是可以的,你要保证,你每一个使用游标的地方,都是为了直观的输出数据或者变量赋值,而不是为了加工处理游标中的数据。

...快啊???目前我们存储过程都是用cursor,但很慢。。
可以一句 merge 语句就处理掉的。那么当然优先使用 merge 处理比较好。假如业务逻辑很复杂, 一句 merge 语句无法处理。迫不得已,只能使用 游标处理的。可以尝试使用 BULK COLLECT 看看是否能有一些性能上面的提升 http:\/\/hi.baidu.com\/wangzhiqing999\/blog\/item\/2ea041cc0d4606037e3e6f20.html ...

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

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

oracle的存储过程中可以用with查询吗
可以使用的,with相当于建了个临时表。但是只能结合游标使用。比如 procedure TEST(OUT_RESULT out MYTYPE) is begin open cur for with emp as (select * from scott.emp e where e.empno=7499)select * from e;

相似回答