`
jean7155
  • 浏览: 62926 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

一个ref cursor的使用例子

阅读更多
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;
分享到:
评论

相关推荐

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    以下是一个示例Java存储过程,展示了如何从数据库中获取EMP表的所有数据并以REF CURSOR的形式返回: ```java public static ResultSet getEmployees() { // 获取默认连接 Connection conn = new OracleDriver()....

    oracle如何合并多个sys_refcursor详解

    这个例子展示了如何将两个返回相同列的游标合并成一个XML文档,然后可以将这个合并后的XML解析并封装为一个新的`sys_refcursor`返回。通过这种方式,你可以避免复制大量代码,同时保持代码的清晰和可维护性。 总之...

    How To Use REF Cursors in JDBC Program

    这里,`test_ref_cursor`存储过程接受一个输出参数`v1`(REF Cursor)和一个输入参数`v2`。 #### 步骤2:准备CallableStatement 在Java程序中,使用`CallableStatement`来调用上述存储过程。示例如下: ```java ...

    Oracle Procedurl返回数据集的方式总结

    下面是一个简单的示例,展示了如何在PL/SQL匿名块中声明、打开、处理和关闭REF CURSOR: ```sql DECLARE rc SYS_REFCURSOR; BEGIN OPEN rc FOR SELECT * FROM employees WHERE department_id = 100; LOOP ...

    Oracle游标的使用

    在示例中,`add_sal`过程返回一个`sys_refCursor`,调用者可以通过`FETCH`循环来访问数据。 三、`ref cursor`与`sys_refCursor` `ref cursor`是Oracle早期版本中的数据类型,需要在包中定义。而`sys_refCursor`是更...

    plsql.zip_PLSQL Developer_cursor

    在这个函数中,我们动态构造了SQL查询,并使用`OPEN FOR`打开一个引用游标。调用这个函数时,返回的是一个可以遍历的结果集。 总结来说,PLSQL中的三种游标各有其特点和适用场景。显示游标提供完全的控制,适合处理...

    oracle游标变量和数据包

    为了能够使用 Refcursor,首先需要定义一个新的类型来表示它: - **弱类型派生**:这种类型的 Refcursor 不限定查询结果的数据结构,即它可以返回任何类型的记录集。 - 示例代码:`type myclass is refcursor;` -...

    oracle的存储过程如何返回结果集

    下面是一个使用函数返回结果集的例子: ```sql CREATE OR REPLACE package pkg_test as TYPE myrctype IS REF CURSOR; -- 定义 Ref Cursor 类型 FUNCTION get(intID NUMBER) RETURN myrctype; -- 函数声明 end ...

    Java获取Oracle存储过程返回的Cursor

    在提供的示例中,我们有一个名为TEST的包,包含一个名为GET_CURSOR_RESULT的存储过程。该过程接受四个参数:P_STARTINDEX(开始索引),P_LIMIT(限制返回的行数),P_DEAL_TYPE(处理类型)以及CR(输出参数,用于...

    Oracle数据库中的Cursor介绍

    **游标(Cursor)**是Oracle数据库中的一个重要特性,主要用于处理SQL查询返回的结果集。它允许应用程序以更灵活的方式逐行处理查询结果,而非一次性处理整个结果集。这种方式非常适合那些需要逐条处理数据的应用场景...

    Oracle 存储过程返回结果集.doc

    这里使用了REF CURSOR类型,它是一个指向结果集的指针。REF CURSOR类型的声明通常放在包规范(PACKAGE SPECIFICATION)中,然后在包主体(PACKAGE BODY)中定义具体的过程来打开和处理这个游标。以下是一个例子: `...

    Oracl返回多个结果集

    这里的关键技术是使用REFCURSOR(引用游标),它是一种特殊类型的游标,可以作为存储过程的输出参数,使得一个存储过程能够返回多个结果集。 ### Oracle返回多个结果集 #### 一、基本概念 在Oracle数据库中,通常...

    怎么返回一个数据集.doc

    在提供的代码段中,`ROME`包定义了一个名为`GetCompany`的函数,它接受一个字符参数`key`,并返回一个REF CURSOR。当调用这个函数时,它会打开一个指向`Company`表中`com_ID`等于`key`的所有列的游标,并将其返回给...

    java调用oracle存储过程返回结果集,Record,cursor.[参考].pdf

    - `TESTPACKAGE` 包含了一个名为`type_cursor`的Ref Cursor类型变量,用于存储返回的游标。 3. **创建Procedure**: - `test_items` 这个过程接收一个`OUT`参数`MyTable`,类型为`TESTPACKAGE.type_cursor`。在这...

    proc 游标讲述

    以下是一个示例: ```sql DECLARE v_ename EMP.ENAME%TYPE; v_salary EMP.SAL%TYPE; CURSOR c_emp IS SELECT ename, sal FROM emp; BEGIN OPEN c_emp; FETCH c_emp INTO v_ename, v_salary; -- 处理数据... ...

    VB 调用 Oracle 函数返回数据集的例子

    这个例子展示了如何使用VB来调用Oracle存储过程,该过程返回一个游标类型(REF CURSOR),进而填充ADODB.Recordset对象。 首先,让我们看下Oracle端的PL/SQL代码: ```sql CREATE OR REPLACE PACKAGE "PKG_TEST" ...

    oracle 迅速查询和更新大数据

    在这个例子中,`ref_bulk`变量定义为`bulk_type`类型,这是一个包含多个`emp_table`表行的数组。通过`BULK COLLECT INTO`语句,一次性获取最多250,000条记录,并存储到`ref_bulk`数组中。随后,使用`FORALL`循环将...

    Oracle存储过程返回结果集

    而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 以下是一个简单的存储过程示例,它打开一个游标并返回包含`employees`表所有列的结果集: ...

    pl sql developer 调试存储过程.doc

    在存储过程体内,我们首先声明了一个 REF CURSOR 类型的变量 v_cursor,然后使用 OPEN 语句打开游标,并将游标的结果赋值给 io_cursor。 调试存储过程的重要性 调试存储过程是数据库应用程序开发中的一个重要步骤...

Global site tag (gtag.js) - Google Analytics