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

oracle存储过程

 
阅读更多
CREATE OR REPLACE PROCEDURE PRC_STATISTICS_RTX(
                                               --参数IN表示输入参数,OUT表示输出参数,类型可以使用任意Oracle中的合法类型。
                                               CHECKYEAR    IN VARCHAR2,
                                               CHECKQUARTER IN VARCHAR2) AS
  -----------------定义变量-------------------------
  KPI_USER_ID      NUMBER(11); --当前遍历的员工(被评价人)
  KPI_PRAISE_ID    NUMBER(11); --评价人
  KPI_CONTACT_TIME NUMBER(11); --联系次数 
  KPI_DIRECTOR     VARCHAR2(50); --直接主管,组织结构多负责人,所以可能有多个直接主管
  KPI_DEPT_MANAGER VARCHAR2(50); --部门主管,组织结构多负责人,所以可能有多个部门主管
  KPI_SUBORDINATE  VARCHAR2(1000); --直接下属员工 (组长查询自己的组员,经理及总监查询小组负责人)
  KPI_VARIABLE     VARCHAR2(20); --每次遍历游标时,临时存放数据

  D_QUESTION NUMBER(11); --主管的问卷ID
  E_QUESTION NUMBER(11); --普通员工的问卷ID

  --主管考核维度   直接定义,免去每次for循环来遍历
  D_CHECK_LEVEL1 NUMBER(11); --直接主管
  D_CHECK_LEVEL2 NUMBER(11); --直接下属
  D_CHECK_LEVEL3 NUMBER(11); --同部门
  D_CHECK_LEVEL4 NUMBER(11); --合作部门
  --主管考核维度对应的上限人数
  D_CHECK_NUM1 NUMBER(11); --直接主管
  D_CHECK_NUM2 NUMBER(11); --直接下属
  D_CHECK_NUM3 NUMBER(11); --同部门
  D_CHECK_NUM4 NUMBER(11); --合作部门

  --普通员工考核维度
  E_CHECK_LEVEL1 NUMBER(11); --直接主管
  E_CHECK_LEVEL2 NUMBER(11); --部门主管
  E_CHECK_LEVEL3 NUMBER(11); --同部门
  E_CHECK_LEVEL4 NUMBER(11); --合作部门
  --普通员工考核维度对应的上限人数
  E_CHECK_NUM1 NUMBER(11); --直接主管
  E_CHECK_NUM2 NUMBER(11); --部门主管
  E_CHECK_NUM3 NUMBER(11); --同部门
  E_CHECK_NUM4 NUMBER(11); --合作部门 

  -----------------------定义数组---------------------
  --考核维度表
  -- checklevel m_kpi_360check_level%rowtype;  --定义一个变量(每一行的数据)
  TYPE CHECKLEVELTBL IS TABLE OF M_KPI_360CHECK_LEVEL%ROWTYPE INDEX BY BINARY_INTEGER; --用变量定义一个表结构
  V_CHECKLEVEL CHECKLEVELTBL; --用新的表结构定义一个变量(当做数组使用)

  --问卷
  -- question t_360check_questions%rowtype;  
  TYPE QUESTIONTBL IS TABLE OF T_360CHECK_QUESTIONS%ROWTYPE INDEX BY BINARY_INTEGER;
  V_QUESTION QUESTIONTBL;

  --需要考核的员工
  -- userextend t_usr_extend%rowtype; 
  TYPE USEREXTENDTBL IS TABLE OF T_USR_EXTEND%ROWTYPE INDEX BY BINARY_INTEGER;
  V_EXTEND USEREXTENDTBL;

  --员工的直接主管
  TYPE DIRECTORTBL IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; --用变量定义一个表结构
  V_DIRECTOR DIRECTORTBL;

  --RTX及邮件统计的发送人,接收人和联系次数
  TYPE RTXCONTACT IS TABLE OF W_ECM_IM_LOG%ROWTYPE INDEX BY BINARY_INTEGER; --用变量定义一个表结构
  V_RTXCONTACT RTXCONTACT;

  ---------------定义游标--------------------------
  CURSOR CURSOR_1(NO NUMBER) IS
    SELECT O.MANAGER_IDS
      FROM M_ORGANIZATION O
     WHERE O.PARENT_ID IN
           (SELECT ORG_ID FROM M_EMPLOYEE E WHERE E.USER_ID = NO);

BEGIN
  ------------存储过程开始执行,记录日志--------------
  WRITE_LOG('PROCEDURE:TEST3',
            'START',
            '存储过程TEST3开始执行:统计员工RTX及邮件联系人,生成绩效考核答卷表---------开始执行');
  COMMIT;

  SELECT * BULK COLLECT INTO V_CHECKLEVEL FROM M_KPI_360CHECK_LEVEL T; --考核维度
  SELECT * BULK COLLECT
    INTO V_QUESTION
    FROM T_360CHECK_QUESTIONS
   WHERE CHECK_YEAR = CHECKYEAR
     AND CHECK_QUARTER = CHECKQUARTER; -- 问卷
  SELECT T.* BULK COLLECT
    INTO V_EXTEND
    FROM T_USR_EXTEND T
    JOIN M_EMPLOYEE E
      ON T.USER_ID = E.USER_ID
   WHERE T.IS_CHECK = '1'
     AND E.STATUS = '1'; --参与考核员工 

  -----遍历考核维度,依次获得不同员工级别不同考核维度对应的维度ID-----
  FOR I IN 1 .. V_CHECKLEVEL.COUNT LOOP
    --主管
    IF V_CHECKLEVEL(I).EMP_LEVEL = 0 THEN
      CASE
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 1 THEN
          --直接主管
          D_CHECK_LEVEL1 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          D_CHECK_NUM1   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 2 THEN
          --直接下属
          D_CHECK_LEVEL2 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          D_CHECK_NUM2   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 3 THEN
          --同部门员工
          D_CHECK_LEVEL3 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          D_CHECK_NUM3   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 4 THEN
          --合作部门员工
          D_CHECK_LEVEL4 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          D_CHECK_NUM4   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
      END CASE;
    END IF;
  
    --普通员工
    IF V_CHECKLEVEL(I).EMP_LEVEL = 1 THEN
      CASE
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 1 THEN
          --直接主管
          E_CHECK_LEVEL1 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          E_CHECK_NUM1   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 5 THEN
          --部门主管(二级主管)
          E_CHECK_LEVEL2 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          E_CHECK_NUM2   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 3 THEN
          --同部门员工
          E_CHECK_LEVEL3 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          E_CHECK_NUM3   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
        WHEN V_CHECKLEVEL(I).APPRAISE_LEVEL = 4 THEN
          --合作部门员工
          E_CHECK_LEVEL4 := V_CHECKLEVEL(I).CHECK_LEVEL_ID;
          E_CHECK_NUM4   := V_CHECKLEVEL(I).UPPER_LIMIT_NUM;
      END CASE;
    END IF;
  END LOOP;

  --遍历问卷表,获得不同级别员工对应的问卷ID
  FOR I IN 1 .. V_QUESTION.COUNT LOOP
    --主管
    IF V_QUESTION(I).EMP_LEVEL = 0 THEN
      D_QUESTION := V_QUESTION(I).QID;
    END IF;
    --普通员工
    IF V_QUESTION(I).EMP_LEVEL = 1 THEN
      E_QUESTION := V_QUESTION(I).QID;
    END IF;
  END LOOP;

  --把数据插入临时表中
  ------RTX和邮件的联系次数之和,插入临时表-----------
  INSERT INTO W_ECM_IM_LOG
    SELECT A.IM_FROM_SENDER, A.PRAISE, SUM(NUM) AS NUM
      FROM (SELECT T.IM_FROM_SENDER,
                   REGEXP_SUBSTR(IM_TO_RECEIVERS, '[^,]+', 1, L) AS PRAISE,
                   SUM(NUM) AS NUM
              FROM (SELECT T.IM_FROM_SENDER,
                           T.IM_TO_RECEIVERS,
                           COUNT(*) AS NUM
                      FROM T_ECM_IM_LOG T
                     GROUP BY T.IM_FROM_SENDER, T.IM_TO_RECEIVERS) T,
                   (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 100)
             WHERE L <= LENGTH(IM_TO_RECEIVERS) -
                   LENGTH(REPLACE(IM_TO_RECEIVERS, ',')) + 1
             GROUP BY IM_FROM_SENDER,
                      REGEXP_SUBSTR(IM_TO_RECEIVERS, '[^,]+', 1, L)
            UNION ALL
            SELECT U1.DOMAIN_USER AS IM_FROM_SENDER,
                   U2.DOMAIN_USER AS PRAISE,
                   A.NUM
              FROM (SELECT T.MAIL_FROM_SENDERS,
                           T.MAIL_TO_RECEIVERS,
                           COUNT(*) AS NUM
                      FROM T_ECM_MAIL_LOG T
                     GROUP BY T.MAIL_FROM_SENDERS, T.MAIL_TO_RECEIVERS) A,
                   M_USERS U1,
                   M_USERS U2
             WHERE A.MAIL_FROM_SENDERS = U1.REG_IP
               AND A.MAIL_TO_RECEIVERS = U2.REG_IP
               AND U1.DOMAIN_USER IS NOT NULL
               AND U2.DOMAIN_USER IS NOT NULL) A
     GROUP BY IM_FROM_SENDER, PRAISE;

  --------------------------------开始遍历员工-----------------------------------------------
  --遍历所有参与考核的员工
  FOR I IN 1 .. V_EXTEND.COUNT LOOP
    KPI_USER_ID := V_EXTEND(I).USER_ID; --当前遍历的员工
    ------主管--------------------
    IF V_EXTEND(I).EMP_LEVEL = 0 THEN
      --查找直接主管
      SELECT O.MANAGER_IDS BULK COLLECT
        INTO V_DIRECTOR
        FROM M_ORGANIZATION O
       WHERE O.MANAGER_IDS IS NOT NULL
       START WITH O.ORG_ID IN (SELECT ORG_ID
                                 FROM M_EMPLOYEE E
                                WHERE E.USER_ID = KPI_USER_ID)
      CONNECT BY ORG_ID = PRIOR PARENT_ID
       ORDER BY O.TYPE DESC;
    
      IF V_DIRECTOR.COUNT >= 2 THEN
        KPI_DIRECTOR := V_DIRECTOR(2);
      
        SELECT A.* BULK COLLECT
          INTO V_RTXCONTACT
          FROM (SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                  FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2
                 WHERE T.ACCEPT = U1.DOMAIN_USER
                   AND T.PRAISE = U2.DOMAIN_USER
                   AND U1.USER_ID = KPI_USER_ID
                   AND ',' || KPI_DIRECTOR || ',' LIKE
                       '%,' || U2.USER_ID || ',%'
                 ORDER BY NUM DESC) A
         WHERE ROWNUM <= D_CHECK_NUM1; --组织结构多负责人
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             D_CHECK_LEVEL1,
             D_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
      ----------查找直接下属-------------
      KPI_SUBORDINATE := '';
      --该游标查询自己下级小组负责人,所以查询组长的直接下属时为空
      OPEN CURSOR_1(KPI_USER_ID);
      FETCH CURSOR_1
        INTO KPI_SUBORDINATE;
      --如果游标返回结果为空,则当前遍历员工是组长,查询自己相同小组下的员工作为自己的直接下属
      IF CURSOR_1%NOTFOUND THEN
        SELECT A.* BULK COLLECT
          INTO V_RTXCONTACT
          FROM (SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                  FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2, M_EMPLOYEE E
                 WHERE T.ACCEPT = U1.DOMAIN_USER
                   AND T.PRAISE = U2.DOMAIN_USER
                   AND E.ORG_ID IN
                       (SELECT ORG_ID
                          FROM M_EMPLOYEE
                         WHERE USER_ID = KPI_USER_ID)
                   AND U1.USER_ID = KPI_USER_ID
                   AND E.USER_ID = U2.USER_ID
                 ORDER BY T.NUM DESC) A
         WHERE ROWNUM <= D_CHECK_NUM2;
      
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          --直接下属拼接成字符串,查询同部门员工时,这部分员工不包括在内
          KPI_SUBORDINATE := KPI_SUBORDINATE || ',' || V_RTXCONTACT(J)
                            .PRAISE;
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             D_CHECK_LEVEL2,
             D_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      ELSE
        LOOP
          FETCH CURSOR_1
            INTO KPI_VARIABLE;
          KPI_SUBORDINATE := KPI_SUBORDINATE || ',' || KPI_VARIABLE;
          EXIT WHEN CURSOR_1%NOTFOUND;
        END LOOP;
        KPI_SUBORDINATE := KPI_SUBORDINATE || ',';
        SELECT A.* BULK COLLECT
          INTO V_RTXCONTACT
          FROM (SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                  FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2
                 WHERE T.ACCEPT = U1.DOMAIN_USER
                   AND T.PRAISE = U2.DOMAIN_USER
                   AND U1.USER_ID = KPI_USER_ID
                   AND ',' || KPI_SUBORDINATE || ',' LIKE
                       '%,' || U2.USER_ID || ',%'
                 ORDER BY T.NUM DESC) A
         WHERE ROWNUM <= D_CHECK_NUM2;
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             D_CHECK_LEVEL2,
             D_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
      CLOSE CURSOR_1;
    
      ---------------------查找同部门同事--------------------
      SELECT A.* BULK COLLECT
        INTO V_RTXCONTACT
        FROM (
              
              SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2, M_EMPLOYEE E1
               WHERE T.ACCEPT = U1.DOMAIN_USER
                 AND T.PRAISE = U2.DOMAIN_USER
                 AND U2.USER_ID = E1.USER_ID
                 AND U1.USER_ID = KPI_USER_ID
                 AND E1.DEPT_ID IN
                     (SELECT DEPT_ID
                        FROM M_EMPLOYEE
                       WHERE USER_ID = KPI_USER_ID)
                 AND ',' || KPI_DIRECTOR || ',' NOT LIKE --除去直接主管
                     ',%' || E1.USER_ID || ',%'
                 AND ',' || KPI_SUBORDINATE || ',' NOT LIKE --除去直接下属
                     ',%' || E1.USER_ID || ',%'
               ORDER BY T.NUM DESC) A
       WHERE ROWNUM <= D_CHECK_NUM3;
      IF V_DIRECTOR.COUNT >= 1 THEN
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             D_CHECK_LEVEL3,
             D_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
    
      ----------------------查找不同部门同事------------------
      SELECT A.* BULK COLLECT
        INTO V_RTXCONTACT
        FROM (
              
              SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2, M_EMPLOYEE E1
               WHERE T.ACCEPT = U1.DOMAIN_USER
                 AND T.PRAISE = U2.DOMAIN_USER
                 AND U2.USER_ID = E1.USER_ID
                 AND U1.USER_ID = KPI_USER_ID
                 AND E1.DEPT_ID NOT IN
                     (SELECT DEPT_ID
                        FROM M_EMPLOYEE
                       WHERE USER_ID = KPI_USER_ID)
                 AND ',' || KPI_DIRECTOR || ',' NOT LIKE
                     ',%' || E1.USER_ID || ',%'
                 AND ',' || KPI_SUBORDINATE || ',' NOT LIKE
                     ',%' || E1.USER_ID || ',%'
               ORDER BY T.NUM DESC) A
       WHERE ROWNUM <= D_CHECK_NUM4;
    
      IF V_DIRECTOR.COUNT >= 1 THEN
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             D_CHECK_LEVEL4,
             D_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
    
    END IF;
  
    ----------------普通员工---------------
    IF V_EXTEND(I).EMP_LEVEL = '1' THEN
      --递归查询,既包括直接主管,又包括部门主管
      SELECT O.MANAGER_IDS BULK COLLECT
        INTO V_DIRECTOR
        FROM M_ORGANIZATION O
       WHERE O.MANAGER_IDS IS NOT NULL
       START WITH O.ORG_ID IN (SELECT ORG_ID
                                 FROM M_EMPLOYEE E
                                WHERE E.USER_ID = KPI_USER_ID)
      CONNECT BY ORG_ID = PRIOR PARENT_ID
       ORDER BY O.TYPE DESC;
    
      ---------直接主管-------
      IF V_DIRECTOR.COUNT >= 1 THEN
        KPI_DIRECTOR := V_DIRECTOR(1);
        --和直接主管之间RTX联系次数
        SELECT A.* BULK COLLECT
          INTO V_RTXCONTACT
          FROM (SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                  FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2
                 WHERE T.ACCEPT = U1.DOMAIN_USER
                   AND T.PRAISE = U2.DOMAIN_USER
                   AND U1.USER_ID = KPI_USER_ID
                   AND ',' || KPI_DIRECTOR || ',' LIKE
                       '%,' || U2.USER_ID || ',%'
                 ORDER BY NUM DESC) A
         WHERE ROWNUM <= E_CHECK_NUM1; --组织结构多负责人
      
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             E_CHECK_LEVEL1,
             E_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
    
      ------部门主管-----
      IF V_DIRECTOR.COUNT >= 2 THEN
        KPI_DEPT_MANAGER := V_DIRECTOR(2);
        --和部门主管之间RTX联系次数
        SELECT A.* BULK COLLECT
          INTO V_RTXCONTACT
          FROM (SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                  FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2
                 WHERE T.ACCEPT = U1.DOMAIN_USER
                   AND T.PRAISE = U2.DOMAIN_USER
                   AND U1.USER_ID = KPI_USER_ID
                   AND ',' || KPI_DEPT_MANAGER || ',' LIKE
                       '%,' || U2.USER_ID || ',%'
                 ORDER BY NUM DESC) A
         WHERE ROWNUM <= E_CHECK_LEVEL2; --组织结构多负责人
      
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             E_CHECK_LEVEL2,
             E_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
    
      -------------部门内同事-------
      SELECT A.* BULK COLLECT
        INTO V_RTXCONTACT
        FROM (
              
              SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2, M_EMPLOYEE E1
               WHERE T.ACCEPT = U1.DOMAIN_USER
                 AND T.PRAISE = U2.DOMAIN_USER
                 AND U2.USER_ID = E1.USER_ID
                 AND U1.USER_ID = KPI_USER_ID
                 AND E1.DEPT_ID IN
                     (SELECT DEPT_ID
                        FROM M_EMPLOYEE
                       WHERE USER_ID = KPI_USER_ID)
                 AND ',' || KPI_DIRECTOR || ',' NOT LIKE
                     ',%' || E1.USER_ID || ',%'
                 AND ',' || KPI_DEPT_MANAGER || ',' NOT LIKE
                     ',%' || E1.USER_ID || ',%'
               ORDER BY T.NUM DESC) A
       WHERE ROWNUM <= E_CHECK_NUM3;
    
      IF V_DIRECTOR.COUNT >= 1 THEN
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             E_CHECK_LEVEL3,
             E_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
    
      -------------部门间同事-------
      SELECT A.* BULK COLLECT
        INTO V_RTXCONTACT
        FROM (
              
              SELECT U1.USER_ID AS ACCEPT, U2.USER_ID AS PRAISE, T.NUM
                FROM W_ECM_IM_LOG T, M_USERS U1, M_USERS U2, M_EMPLOYEE E1
               WHERE T.ACCEPT = U1.DOMAIN_USER
                 AND T.PRAISE = U2.DOMAIN_USER
                 AND U2.USER_ID = E1.USER_ID
                 AND U1.USER_ID = KPI_USER_ID
                 AND E1.DEPT_ID NOT IN
                     (SELECT DEPT_ID
                        FROM M_EMPLOYEE
                       WHERE USER_ID = KPI_USER_ID)
                 AND ',' || KPI_DIRECTOR || ',' NOT LIKE
                     ',%' || E1.USER_ID || ',%'
                 AND ',' || KPI_DEPT_MANAGER || ',' NOT LIKE
                     ',%' || E1.USER_ID || ',%'
               ORDER BY T.NUM DESC) A
       WHERE ROWNUM <= E_CHECK_NUM4;
    
      IF V_DIRECTOR.COUNT >= 1 THEN
        FOR J IN 1 .. V_RTXCONTACT.COUNT LOOP
          INSERT INTO T_360CHECK_ANSWER_TMP
            (CA_ID,
             ACCEPT_APPRAISE_USER,
             APPRAISE_USER,
             CHECK_LEVEL_ID,
             QID,
             STATUS,
             CONTACT_TIMES)
          VALUES
            (OA_SEQ_BASE.NEXTVAL,
             KPI_USER_ID,
             V_RTXCONTACT(J).PRAISE,
             E_CHECK_LEVEL4,
             E_QUESTION,
             0,
             V_RTXCONTACT(J).NUM);
        END LOOP;
      END IF;
    
    END IF;
  END LOOP;

  --------------------RTX和邮件统计结束,记录日志----------------------------
  WRITE_LOG('PROCEDURE:TEST3',
            'END',
            '存储过程TEST3开始执行:统计员工RTX及邮件联系人,生成绩效考核答卷表------执行结束');
  COMMIT;
EXCEPTION
  --捕获所有的异常(类似JAVA中的Exception)
  WHEN OTHERS THEN
    ROLLBACK;
    --插入异常日志(方法必须有返回值,这里调用另一个存储过程,记录日志)
    WRITE_LOG('PROCEDURE:TEST3',
              'ERROR',
              SUBSTR(SQLERRM, 0, 3000) ||
              SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 0, 1000));
END PRC_STATISTICS_RTX;

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics