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

存储过程代码如下:CREATEORREPLACEPROCEDUREpd_P_visitPlan_answer(sKeyidvarchar2,sVpidvarchar2,s... 存储过程代码如下:

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;
展开
 我来答
无语翘楚
高粉答主

2015-10-21 · 繁杂信息太多,你要学会辨别
知道大有可为答主
回答量:2.5万
采纳率:88%
帮助的人:2567万
展开全部

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的游标在处理大一点的数据量时还是比较乏力的,仅适合用于操作几百上千的小数据量。

handsomemank
2012-09-26 · TA获得超过130个赞
知道小有建树答主
回答量:215
采纳率:0%
帮助的人:184万
展开全部
在sql server 里可以用 临时表,表变量等 .
可以将复合条件的记录都插入到临时表,然后再用 update 等语句对临时表进行计算.
最后将临时表的数据插入到正式表.

其实你这个需求 ,是可以不用触发器的.
多写几个 insert ,update 就是了.
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0319a0e
2012-09-24 · TA获得超过2.2万个赞
知道小有建树答主
回答量:2080
采纳率:85%
帮助的人:1152万
展开全部
可以用集合 批量绑定来 替换游标的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
同学叫我板砖
2012-09-25 · 超过17用户采纳过TA的回答
知道答主
回答量:76
采纳率:0%
帮助的人:66.7万
展开全部
没有吧,除非你自己开发一种新存储过程来替代游标的功能
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lxr_303
2012-09-24 · TA获得超过473个赞
知道小有建树答主
回答量:875
采纳率:0%
帮助的人:515万
展开全部
没有吧,除非你自己开发一种新存储过程来替代游标的功能
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式