Oracle 存储过程游标遍历查询信息,并打印输出异常信息

--市案件审批--for 修复一单多派执行异常的情况,使用游标遍历执行
  PROCEDURE PROC_CASEAPPLY(P_CASENUM     VARCHAR2,
                           P_APPLYTYPE   NUMBER,
                           P_ISAPPROVE   NUMBER,
                           P_DAYS        NUMBER,
                           P_REPCONTENT  VARCHAR2,
                           P_RETURNVALUE OUT NUMBER) IS
    V_CASEID    NUMBER;
    V_RECUSERID NUMBER;
    V_TACHEID   NUMBER;
    V_ROLETYPE  NUMBER;
  BEGIN
    
    --获取需更新的案件信息,因存在一单多派的情况,所以需遍历查询到的案件
    declare--定义游标 
      cursor case_cursor is select 案件记录号 from 投诉业务表 where 市案件公文号 = P_CASENUM and 环节号 in (95, 96);
    begin
      for curcase in case_cursor loop--遍历游标
        V_CASEID := curcase.案件记录号;  
        
        
        /*SELECT 案件记录号
          INTO V_CASEID
          FROM 投诉业务表
         WHERE 市案件公文号 = P_CASENUM
           AND 环节号 IN (95, 96);*/
      
        SELECT 申请部门人员
          INTO V_RECUSERID
          FROM 案件申请表
         WHERE 案件记录号 = V_CASEID
           AND 是否最新 = 1
           AND 申请类型 = P_APPLYTYPE;
      
        SELECT ROLETYPE
          INTO V_ROLETYPE
          FROM TABBASEPERSON
         WHERE CHVID = V_RECUSERID;
      
        --退回
        IF P_APPLYTYPE = 1 THEN
          IF P_ISAPPROVE = 0 THEN
            --驳回
          
            UPDATE 案件申请表
               SET 是否驳回 = 1, 答复时间 = SYSDATE, 答复内容 = P_REPCONTENT
             WHERE 案件记录号 = V_CASEID
               AND 申请类型 = 1
               AND 是否最新 = 1;
            UPDATE 投诉业务表 SET 环节号 = 98 WHERE 案件记录号 = V_CASEID;
            V_TACHEID := 98;
          ELSE
            --批准
            /*世道要变了,不能删除市级批准退回的案件。 yy 2015年3月19日10:29:08
            DELETE FROM 投诉业务表 WHERE 案件记录号 = V_CASEID;
            DELETE FROM TABDOCSTEP WHERE CASEID = V_CASEID;
            DELETE FROM 案件申请表 WHERE 案件记录号 = V_CASEID;
            */
            /*103:市批准退回*/
            UPDATE 投诉业务表 T
               SET T.环节号 = 103
             WHERE T.市案件公文号 = P_CASENUM; --T.案件记录号 = V_CASEID;
            V_TACHEID := 103;
          
            UPDATE 案件申请表
               SET 是否批准  = 1, 答复时间 = SYSDATE, 答复内容 = P_REPCONTENT
             WHERE 案件记录号 = V_CASEID
               AND 申请类型 = 1
               AND 是否最新 = 1;
          
            --转移结案表
            PKG_TACHERUN.PRO_TRANSFORM(V_CASEID,
                                       '投诉业务表',
                                       '案件记录号',
                                       '案件公文号,实际完成时间,规定完成时间,派单员,环节号,主办部门人员,主办部门,主办发送标志,主办签收标志');
          
          END IF;
        ELSE
          --延期
          IF P_ISAPPROVE = 0 THEN
            --驳回
            UPDATE 案件申请表
               SET 是否驳回 = 1, 答复时间 = SYSDATE, 答复内容 = P_REPCONTENT
             WHERE 案件记录号 = V_CASEID
               AND 申请类型 = 2
               AND 答复时间 IS NULL;
            --AND 是否最新 = 1;        
            IF V_ROLETYPE = 29 THEN
              UPDATE 投诉业务表 SET 环节号 = 117 WHERE 案件记录号 = V_CASEID;
              V_TACHEID := 117;
            ELSIF V_ROLETYPE = 28 THEN
              UPDATE 投诉业务表 SET 环节号 = 18 WHERE 案件记录号 = V_CASEID;
              V_TACHEID := 18;
            END IF;
          
          ELSE
            UPDATE 案件申请表
               SET 答复时间 = SYSDATE, 答复内容 = P_REPCONTENT, 是否批准 = 1
             WHERE 案件记录号 = V_CASEID
               AND 申请类型 = 2
                  --AND 是否最新 = 1;
               AND 答复时间 IS NULL;
          
            IF V_ROLETYPE = 28 THEN
              UPDATE 投诉业务表 SET 环节号 = 17 WHERE 案件记录号 = V_CASEID;
              V_TACHEID := 17;
            
            ELSIF V_ROLETYPE = 29 THEN
              UPDATE 投诉业务表 SET 环节号 = 116 WHERE 案件记录号 = V_CASEID;
              V_TACHEID := 116;
            END IF;
          
            UPDATE 投诉业务表
               SET 办理时间       = 办理时间 + P_DAYS * 1440,
                   规定完成时间   = 规定完成时间 + P_DAYS,
                   市办理时限     = 市办理时限 + P_DAYS * 1440,
                   市规定完成时间 = 市规定完成时间 + P_DAYS
             WHERE 市案件公文号 = P_CASENUM;
          END IF;
        END IF;
      
        --更新环节表数据
        UPDATE TABDOCSTEP
           SET STATE = 3, ISNEWEST = 0, SENDDATE = SYSDATE
         WHERE ISNEWEST = 1
           AND RECID = PKG_CONSTANT.USERIDCITY
           AND CASEID = V_CASEID;
        --添加环节表数据
        INSERT INTO TABDOCSTEP
          (STEPID, CASEID, SENDID, RECID, TACHEID)
        VALUES
          (SEQ_TABDOCSTEP.NEXTVAL,
           V_CASEID,
           PKG_CONSTANT.USERIDCITY,
           V_RECUSERID,
           V_TACHEID);
          
            
      end loop;
    end;
  
  
    P_RETURNVALUE := 1;
    COMMIT;
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE);
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
      P_RETURNVALUE := 0;
      ROLLBACK;
  END;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle存储过程游标用于遍历查询结果集。游标可以让我们在处理大量数据时更加灵活和高效,可以控制和管理数据的访问方式。 Oracle中的游标主要有三种类型:显式游标、隐式游标游标变量。 1. 显式游标 显式游标是需要我们手动定义、打开、获取和关闭的游标。我们需要用PL/SQL代码来定义游标,然后使用OPEN、FETCH和CLOSE语句来操作游标。 例如,下面的代码创建了一个显式游标,然后使用FETCH语句获取游标中的数据: DECLARE CURSOR cur_emp IS SELECT empno, ename, hiredate FROM emp; emp_rec cur_emp%ROWTYPE; BEGIN OPEN cur_emp; LOOP FETCH cur_emp INTO emp_rec; EXIT WHEN cur_emp%NOTFOUND; dbms_output.put_line(emp_rec.empno || ' ' || emp_rec.ename || ' ' || emp_rec.hiredate); END LOOP; CLOSE cur_emp; END; 2. 隐式游标 隐式游标Oracle自动创建的游标。当我们执行SELECT语句时,Oracle会自动创建一个隐式游标,然后返回结果集。 例如,下面的代码使用隐式游标遍历查询结果集: DECLARE emp_rec emp%ROWTYPE; BEGIN FOR emp_rec IN (SELECT empno, ename, hiredate FROM emp) LOOP dbms_output.put_line(emp_rec.empno || ' ' || emp_rec.ename || ' ' || emp_rec.hiredate); END LOOP; END; 3. 游标变量 游标变量是一种特殊的游标类型,它可以将游标作为参数传递给存储过程或函数。 例如,下面的代码定义了一个游标变量,然后将游标作为参数传递给一个存储过程: DECLARE TYPE cur_emp IS REF CURSOR; emp_cur cur_emp; PROCEDURE proc_emp(p_cur IN OUT cur_emp) IS emp_rec emp%ROWTYPE; BEGIN LOOP FETCH p_cur INTO emp_rec; EXIT WHEN p_cur%NOTFOUND; dbms_output.put_line(emp_rec.empno || ' ' || emp_rec.ename || ' ' || emp_rec.hiredate); END LOOP; END; BEGIN OPEN emp_cur FOR SELECT empno, ename, hiredate FROM emp; proc_emp(emp_cur); CLOSE emp_cur; END; 总之,Oracle中的游标是一种非常有用的工具,可以让我们更加高效地处理大量数据。根据不同的需求,我们可以选择显式游标、隐式游标游标变量来实现游标操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值