需求

根据输入地市来提取10月份的工单汇总情况

实现一个简单存储过程

思考

大体框架便是

CREATE OR REPLACE PROCDURE XXX(入参格式)  IS

BEGIN 

主体查询代码

END XXX

可以看出,主题代码仍然是核心,只是外面套了一层壳,届时只用将所查询表的参数关联入参即可,

不过由于输入入参编号的不确定性,同时也要分情况处理,包括异常结果。

实现

稍稍学习了一点存储过程,工作中便稍微写了一下,由于部分工作表等数据可能保密,已经严格做敏感词处理 :oops:

CREATE OR REPLACE PROCEDURE SJH_YKLC(IN_ORG VARCHAR2) IS--定义一个入参IN_ORG
  ERROR_NO EXCEPTION; --自定义一个异常提示
BEGIN
  IF LENGTH(IN_ORG) IN ('5', '7', '9') AND IN_ORG LIKE '3166%' AND
     IN_ORG <> 'ykadmin' THEN
    --判断输入的供电编号位数是否为正常市、县、供电所编号
    FOR S IN (SELECT *
                FROM SJHUP.O_OR
               WHERE OR_NO LIKE SUBSTR(IN_ORG, 1, 5) || '%'
                 AND ORG_TYPE = '04'
                 AND ORG_NAME NOT LIKE '%注销%' --对供电所编号输入长度进行截取,使其在目标市公司内提取县公司
              ) LOOP
      DELETE FROM SJH_YKBB SJH
       WHERE SJH.X_ORG =
             (SELECT J.O_NAME FROM SJHUP.O_OR O WHERE J.O_NO = S.OR_NO);
      COMMIT; --如果处理后的编号在表中重复,先删除原有数据再执行插入
      INSERT INTO SJH_YKBB
        SELECT (SELECT J.O_NAME
                  FROM SJHUP.O_OR O
                 WHERE J.O_NO = SUBSTR(S.OR_NO, 1, 5)) 市,
               (SELECT J.O_NAME
                  FROM SJHUP.O_OR O
                 WHERE J.O_NO = S.OR_NO) 县,
               COUNT(SA.APP_NO) 十月份流程单数,
               COUNT(CASE
                       WHEN SA.SORT_CODE = '03' AND --低压居民
                            TRUNC((C.END_DATE - C.BEGIN_DATE), 0) > 5 THEN
                        SA.APP_NO
                     END) 大于5天居民流程单数,
               COUNT(CASE
                       WHEN SA.SORT_CODE IN ('02', '03') AND --低压居民和低压非居民
                            TRUNC((C.END_DATE - C.BEGIN_DATE), 0) > 5 THEN
                        SA.APP_NO
                     END) 大于5天低压流程单数,
               COUNT(CASE
                       WHEN SA.SORT_CODE = '01' AND --高压用户
                            TRUNC((C.END_DATE - C.BEGIN_DATE), 0) > 5 THEN
                        SA.APP_NO
                     END) 大于5天高压流程单数
          FROM SJHUP.ARC_APP SA, CCGC.INSTANCES_CUR C
         WHERE SA.APP_NO = C.APP_NO
           AND SA.PS_OR_NO LIKE S.OR_NO || '%' --归档流程中的供电所编号关联游标S的县公司编号
           AND C.ITEM_TYPE = '01'
           AND C.STATE = 'COMPLETE'
           AND C.END_DATE >= TO_DATE('20191001', 'yyyymmdd')
           AND C.END_DATE >= TO_DATE('20191010', 'yyyymmdd')
         GROUP BY SUBSTR(S.OR_NO, 1, 5), S.OR_NO
         ORDER BY SUBSTR(S.OR_NO, 1, 5);
      COMMIT;
    END LOOP;
  END IF;
  IF IN_ORG = 'ykadmin' THEN
    --输入特定字符ykadmin,实现全省业扩工单详情存储
    FOR S IN (SELECT *
                FROM SJHUP.O_OR
               WHERE ORG_TYPE = '04'
                 AND ORG_NAME NOT LIKE '%注销%' --对省内所有的县公司进行遍历提取
              ) LOOP
      DELETE FROM SJH_YKBB SJH
       WHERE SJH.X_ORG =
             (SELECT J.O_NAME FROM SJHUP.O_OR O WHERE J.O_NO = S.OR_NO);
      COMMIT; --如果输入的编号处理后在表中重复,先删除原有数据再执行插入
      INSERT INTO SJH_YKBB
        SELECT (SELECT J.O_NAME
                  FROM SJHUP.O_OR O
                 WHERE J.O_NO = SUBSTR(S.OR_NO, 1, 5)) 市,
               (SELECT J.O_NAME
                  FROM SJHUP.O_OR O
                 WHERE J.O_NO = S.OR_NO) 县,
               COUNT(SA.APP_NO) 十月份流程单数,
               COUNT(CASE
                       WHEN SA.SORT_CODE = '03' AND --低压居民
                            TRUNC((C.END_DATE - C.BEGIN_DATE), 0) > 5 THEN
                        SA.APP_NO
                     END) 大于5天居民流程单数,
               COUNT(CASE
                       WHEN SA.SORT_CODE IN ('02', '03') AND --低压居民和低压非居民
                            TRUNC((C.END_DATE - C.BEGIN_DATE), 0) > 5 THEN
                        SA.APP_NO
                     END) 大于5天低压流程单数,
               COUNT(CASE
                       WHEN SA.SORT_CODE = '01' AND --高压用户
                            TRUNC((C.END_DATE - C.BEGIN_DATE), 0) > 5 THEN
                        SA.APP_NO
                     END) 大于5天高压流程单数
          FROM SJHUP.ARC_APP SA, CCGC.INSTANCES_CUR C
         WHERE SA.APP_NO = C.APP_NO
           AND SA.PS_OR_NO LIKE S.OR_NO || '%' --归档流程中的供电所编号关联S的县公司编号
           AND C.ITEM_TYPE = '01'
           AND C.STATE = 'COMPLETE'
           AND C.END_DATE >= TO_DATE('20191001', 'yyyymmdd')
           AND C.END_DATE >= TO_DATE('20191010', 'yyyymmdd')
         GROUP BY SUBSTR(S.OR_NO, 1, 5), S.OR_NO
         ORDER BY SUBSTR(S.OR_NO, 1, 5);
      COMMIT;
    END LOOP;
  END IF;
  IF (LENGTH(IN_ORG) NOT IN ('5', '7', '9') OR IN_ORG NOT LIKE '3166%') AND
     IN_ORG <> 'ykadmin' THEN
    --输入不正常的字符,执行异常
    RAISE ERROR_NO; --当输入的长度不满足市、县、供电所或者输入不满足河南省3166时,调用异常
  END IF;
END SJH_YKLC;

结果

Oracle在procdure中找到刚刚编译的包,test一下

同样,由于结果数据敏感性,进行一些马 克处理 :!:

市公司入参

实现一个简单存储过程

市公司入参结果

实现一个简单存储过程

特定值入参

实现一个简单存储过程

特定值入参结果

实现一个简单存储过程

不规范入参及结果

实现一个简单存储过程

 


只有兴趣使快乐真实