来自 IT技术分享 2018-11-13 15:57 的文章

一个ref cursor的使用例子

一个ref cursor的使用例子   Sql代码   create or replace   procedure prod_fixing_datacb IS              type cur_userId is ref cursor; -- 游动浮标定义          c_msgUserIds    cur_userId;       c_actionUserIds cur_userId;       c_msgUids       cur_userId;       c_todoUserIds   cur_userId;              mysql           varchar2(4000);           n_msgUserId     number:=0; -- 承办用户wf_msg.nUserId       n_actionUserId  number:=0; -- 承办用户wf_proc_action.nUserId       n_msgUid        number:=0; -- 来文登记用户wf_msg.nUserId       v_todoUserIds   varchar2(2000);              n_userId        number:=0; -- 获取的承办用户结果       n_nDocId        number:=0;       n_nFlowId       number:=0;          CURSOR c_fixing_docIds IS       -- 修复收文中批示,拟办节点缺少续办对象的数据           select                gwe.nDocId, gwe.nFlowId           from                wf_doc_gw gw, wf_doc_gw_entity gwe           where gw.ndocId = gwe.ndocId               and gw.ndocsortId = 1               and gw.nstate=0               and gw.cProcUserList is null               and gw.nProcId in (66,10)           order by gw.nDocId;      begin      open c_fixing_docIds;        Loop           Fetch c_fixing_docIds into            n_nDocId,n_nFlowId;                      if (n_nFlowId>0) then             -- 获得承办用户USERID             mysql := 'select msgUserId from ('||               'select nMsgId, nUserId as msgUserId,currentProcId,'||               'row_number() over(partition by currentProcId order by dwrite desc) rowNumberId '||               'from wf_msg '||               'where currentProcId = 64 and ndocid='||n_nDocId||') a where rowNumberId=1';                          open c_msgUserIds for mysql;               loop                 fetch c_msgUserIds into n_msgUserId;               exit when c_msgUserIds%notfound;                                if(n_msgUserId>0) then                   n_userId := n_msgUserId;               end if;             end loop;              close c_msgUserIds;                          if (n_userId=0) then               mysql := 'select actionUserId from '||                                   '(select nUserId as actionUserId, '||                                   'row_number() over(partition by nFlowId order by dRecvDate desc) rowNumberId '||                                   'from wf_proc_action '||                                   'where nProcId = 64 and '||                                   'ndocid='||n_nDocId||') a where rowNumberId=1";';                            open c_actionUserIds for mysql;                 loop                   fetch c_actionUserIds into n_actionUserId;                 exit when c_actionUserIds%notfound;                   if(n_actionUserId>0) then                     n_userId := n_actionUserId;                 end if;               end loop;                close c_actionUserIds;             end if;                          if (n_userId=0) then               mysql := 'select msgUserId from ('||               'select nMsgId, nUserId as msgUserId,currentProcId,'||               'row_number() over(partition by currentProcId order by dwrite desc) rowNumberId '||               'from wf_msg '||               'where currentProcId = 20 and ndocid='||n_nDocId||') a where rowNumberId=1';                            open c_msgUids for mysql;                 loop                   fetch c_msgUids into n_msgUid;                 exit when c_msgUids%notfound;                   if(n_msgUid>0) then                     n_userId := n_msgUid;                 end if;               end loop;                close c_msgUids;             end if;             Dbms_Output.put_line('n_userId:'||n_userId);                              mysql:='update dispatch_entitylog '||                   'set sendstatus=1, receiveuserid='||n_userId||','||                                   'receivedate=sysdate,receivestatus=1,'||                                   'receiveusername=(select u.realname from tbuser u where u.userid='||n_userId||'),'||                                   'receiveentityname=(select e1.entityname from tbuser u, tbentity e1 where u.currententityid=e1.entityid and u.userid='||n_userId||'),'||                                   'receiveorgname=(select e2.entityname from tbuser u, tbentity e1, tbentity e2 where u.currententityid=e1.entityid and e1.belongedentityid = e2.entityid and u.userid = '||n_userId||') '||                                   'where nFlowId='||n_nFlowId||' and receivedate is null and nProcId = 64'; -- 承办部门修改,其它暂时不修改                       execute immediate mysql;             Dbms_Output.put_line(mysql);                              mysql:='insert into wf_proc_flow (nFlowId,nDocId, nProcId, nDocsortId, '||                     'dRecvDate,dFnshDate, nFinishStatus,nOrder, nAndOr)'||                                   'select '||n_nFlowId||', '||n_nDocId||', 64, 1, sysdate,sysdate,1, 0,0 from dual where not exists '||                                   '(select nFlowId from wf_proc_flow where nDocId='||n_nDocId||' '||                                   'and nProcId=64 and nFlowId='||n_nFlowId||')';             execute immediate mysql;                             Dbms_Output.put_line(mysql);                                      mysql := 'update wf_proc_flow set cUserList='||to_char(n_userId)||' '||                                   'where nFlowId = '||n_nFlowId||' and nDocId='||n_nDocId||' '||                                     'and cUserList is null';                       execute immediate mysql;                             Dbms_Output.put_line(mysql);                                                                    mysql := 'update wf_proc_flow set dFnshDate=sysdate, nFinishStatus=1 '||                     'where nFlowId ='||n_nFlowId||' and nDocId='||n_nDocId||' '||                       'and dFnshDate is null';                       execute immediate mysql;                             Dbms_Output.put_line(mysql);                                                    mysql := 'insert into wf_proc_action (nDocId, nUserId, nDocsortId, nProcId,dRecvDate,dFnshDate, nFinishStatus,nOrder, nAndOr, nFlowId) '||                                   'select '||n_nDocId||','||n_userId||',1,64,sysdate,sysdate,1,0,0,'||n_nFlowId||' '||                                   'from dual where not exists '||                                   '(select nFlowId from wf_proc_action where nDocId='||n_nDocId||' and nProcId=64 and nFlowId='||n_nFlowId||')';                       execute immediate mysql;                             Dbms_Output.put_line(mysql);                                                    mysql:= 'update wf_proc_action set nUserId='||n_userId||' '||                                     'where nFlowId ='||n_nFlowId||' and nDocId='||n_nDocId||' and nUserId is null';                       execute immediate mysql;                             Dbms_Output.put_line(mysql);                                                                    mysql := 'update wf_proc_action set dFnshDate=sysdate, nFinishStatus=1 '||                   'where nFlowId = '||n_nFlowId||' and nDocId='||n_nDocId||' and dFnshDate is null';                       execute immediate mysql;                             Dbms_Output.put_line(mysql);                                                mysql := 'delete from wf_doc_gw_entity where nFlowid='||n_nFlowId;                       execute immediate mySql;                             Dbms_Output.put_line(mysql);                            mysql := 'select wmsys.wm_concat(d.nUserId) from (select wpa.nFlowId, wpa.nUserId,'||                 'row_number() over (partition by wpa.nDocId order by wpa.nFlowId) rowNumId,'||                 'row_number() over (partition by wpa.nFlowId order by wpa.nOrder desc) rowNumberId '||                 'from wf_proc_action wpa, wf_doc_gw gw '||                 'where wpa.ndocid = gw.nDocId '||                 'and wpa.nProcId = gw.nProcId '||                 'and wpa.dfnshdate is null '||                 'and gw.nDocId = '||n_nDocId||') d where d.rowNumberId=1 and d.rowNumId=1';             Dbms_Output.put_line(mysql);                            open c_todoUserIds for mysql;               loop                   fetch c_todoUserIds into v_todoUserIds;                 exit when c_todoUserIds%notfound;                   Dbms_Output.put_line('v_todoUserIds:'||v_todoUserIds);               end loop;              close c_todoUserIds;                          if(v_todoUserIds is null) then               mysql:='update wf_doc_gw set cProcUserList='||n_userId||', nProcStatus=1 where nDocId='||n_nDocId;             else               mysql:='update wf_doc_gw set cProcUserList='||v_todoUserIds||',nProcStatus=0 where nDocId='||n_nDocId;             end if;             execute immediate mySql;                             Dbms_Output.put_line(mysql);                end if;        Exit when c_fixing_docIds%notfound;                      end loop;        commit;            Exception           when others then              close c_fixing_docIds;              rollback;            Dbms_Output.put_line(Sqlerrm);                      if c_fixing_docIds%isopen then              close c_fixing_docIds;        end if;     end prod_fixing_datacb;  

http://www.bkjia.com/oracle/482062.htmlwww.bkjia.comtruehttp://www.bkjia.com/oracle/482062.htmlTechArticle一个ref cursor的使用例子 Sql代码 create or replace procedure prod_fixing_datacb IS type cur_userId is ref cursor; -- 游动浮标定义 c_msgUserIds cur_userId; c_actionUs...

本文源自: AG88平台