最近因为项目需要要写存储过程,以前没咋写过,接触到是接触过,在软通的时候接触过,那是华为的项目那个几个存储过程很大很复杂,也很乱,注释也少,看了个大概。最近一个月,前后也写了七八个简单点的存储过程,也对存储过程有了一个简单的认识,其实也不是很难,多查资料,多实践。闲话不扯了,下面主要说一下游标的组合使用,记录下来即便以后长时间不用了忘记。
场景:有几张表,现在根据业务要求要处理表b中的数据,但先要安照一个标准来处理是吧,这个标准又在表a中,a表中的标准有不是一条,现在需要安照a表的标准吧b表的数据都处理一边。这个是业务。
思考:首先要安装a表来处理的话,是不是要循环a表中的数据来处理那?肯定的,那就要先先一个游标来控制a表循环了。接下来要根据a表的标准来分析b表的数据,那按照java的理解应该是在a表的循环中套一个循环来处理b表的数据,其实这里也是一样的,那就还需要一个游标来控制整个里层的循环了,到这就要考虑怎么来嵌套游标循环了,可以百度“oracle 嵌套游标的使用”看看,这里不记录那些了,由于业务需要b表的数据量有比较大,a表的某一个标准也只是b表中的一部分数据,就是说但嵌套循环的时候还需要a表的中那条记录的一些字段信息。这样嵌套的时候考虑的就要多一点了,最后我选择使用带参数的游标来实现,把需要的a表参数传入b表中。
具体例子:
create or replace procedure P_SBZL_BLDY is
--定义变量
v_xlbh SP_DATA_TQI.Xlbh%type;
v_xingb SP_DATA_TQI.Xingb%type;
v_qslc SP_DATA_TQI.tqilc%type;
v_zzlc SP_DATA_TQI.tqilc%type;
--定义“标准”的游标
CURSOR bzs IS
SELECT * from sp_dic_bldystandard b;
---定义要处理的具体数据的游标
CURSOR sjs (vxlbh varchar2,vxingb varchar2,vqslc number,vzzlc number) IS
select t.xlbh,t.xlm,t.xingb,t.xingbmc,t.tqisum,t.tqilc,t.dyid,p.rpcgs,p.ypcgs,p.cpcgs from SP_DATA_TQI t left join sp_sbzl_pcgs p on t.dyid = p.dyid
where t.tqilc > vqslc and t.tqilc<vzzlc and t.xlbh = vxlbh and t.xingb = vxingb and p.jcny = to_char(sysdate,'yyyy-mm') and to_char(t.jcrq,'yyyy-mm')= to_char(sysdate,'yyyy-mm');
begin
--清除当月数据
delete SP_SBZL_BLDYXX t where t.scny = to_char(sysdate,'yyyy-mm');
commit;
--循环标准
for c in bzs loop
begin
v_xlbh := c.xlbh;
v_xingb := c.xingb;
v_qslc := c.qslc;
v_zzlc := c.zzlc;
--循环具体数据把相关参数传入
for bhs in sjs(v_xlbh,v_xingb,v_qslc,v_zzlc) loop
begin
--一级
if bhs.tqisum<c.tqii and (bhs.ypcgs<c.cari) and (bhs.cpcgs<c.czypci) and (bhs.rpcgs<c.tcypci) then
insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅰ',c.id);
commit;
-- 2级
elsif bhs.tqisum>c.tqiii or (bhs.ypcgs>c.carii) or (bhs.cpcgs>c.czypcii) or (bhs.rpcgs>c.tcypcii) then
--dbms_output.put_line('2');
insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅱ',c.id);
commit;
--3级
elsif ((bhs.ypcgs>c.cariii1) and ( bhs.ypcgs>c.pciii1))
or ((bhs.ypcgs>c.cariii2) and (bhs.tqisum>c.tqiiii1))
or (bhs.tqisum>c.tqiiii2 and ( bhs.cpcgs>c.pciii2 or bhs.rpcgs>c.pciii2))
or (bhs.ypcgs>c.cariii3) then
insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅲ',c.id);
commit;
--4级
elsif ( bhs.tqisum>c.tqiiv and (bhs.ypcgs>c.cariv1) and ( (bhs.cpcgs > c.czypciv) or (bhs.rpcgs > c.tcypciv) ) ) or (bhs.ypcgs>c.cariv2) then
insert into SP_SBZL_BLDYXX values ( S_COMM_PK.NEXTVAL,bhs.xlbh,bhs.xlm,bhs.xingb,bhs.xingbmc,bhs.tqilc,bhs.tqisum,bhs.dyid,to_char(sysdate,'yyyy-mm'),'Ⅳ',c.id);
commit;
end if;
end;
end loop;
end;
end loop;
/* open cs;
loop
fetch cs into rec_test2.qslc, cur_test1;
exit when cs%notfound;
dbms_output.put_line(rec_test2.qslc);
loop
fetch cur_test1 into rec_test1;
exit when cur_test1%notfound;
dbms_output.put_line(rec_test1.tqilc);
end loop;
end loop;
*/
/*for c in cs loop
BEGIN
cursor zs is select * from SP_DATA_TQI t left join sp_sbzl_pcgs p on t.dyid = p.dyid where t.tqilc > c.qslc and t.tqilc<c.zzlc;
for s in zs loop
begin
if s.tqiz<c.tqii then
--i
dbms_output.put_line('1');
elsif s.tqiz > c.tqii then
dbms_output.put_line('2');
end;
END;
end loop;*/
end P_SBZL_BLDY;
游标的一些具体写法我就不记录了,这里的目的主要是以后遇到这类需要可以这样来实现。
分享到:
相关推荐
Oracle存储过程、游标、函数的详解
oracle存储过程使用游标对多表操作例子
讲有关java如何调用ORACLE存储过程以及游标使用,它只包含JAVA调用ORACLE存储过程游标使用(上),还有JAVA调用ORACLE存储过程游标使用(上),
Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标
用callabledStatement调用oracle存储过程实用例子(IN OUT 传参数包括游标类型)
Oracle存储过程游标详解,针对Oracle存储过程游标详细说明。
oracle的存储过程与游标的使用。不错的资源。oracle为10g
利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc
oracle 的函数、存储过程、游标、简单实例 oracle常用语句oracle 的函数、存储过程、游标、简单实例 oracle常用语句
内有三个文件 TESTPACKAGE.txt和CURSOR_TEST2.txt中为oracle建存储过程语句,OracleProcedure.java为java操作存储过程的程序
oracle存储过程使用游标判断2表差异,进行新增更新操作
存储过程调用 Function 并使用 游标循环得到每一条数据然后更新本条数据。初学代码写的不是很好,希望能给初学存储过程的兄弟们提供一点借鉴哦。
NULL 博文链接:https://fruitking.iteye.com/blog/1447333
存储过程中通过返回数据集,通过游标方式实现,以及在java中如何接收的整个过程
NULL 博文链接:https://liuzidong.iteye.com/blog/717050
存储过程 游标 oracle 存储过程 游标 oracle 存储过程 游标 oracle 存储过程 游标 oracle
oracle job 存储过程 视图 游标 实例
包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块
本文实例讲述了Oracle存储过程游标用法。分享给大家供大家参考,具体如下: 使用游标的5个步骤 1、声明一些变量用于保存select语句返回的指 2、声明游标,并指定select 语句 3、打开游标 4、从游标中获取记录 5、...
游标是存储过程最基本的要会的,用于访问 ORACLE 数据库的 DDL 和 TCL 语