存储过程脚本心得

第一种写法:逻辑很复杂,不容易看懂(下面有第二种写法)

 

create or replace procedure EXEC_SJD_HZMX(p_HSD01INTEGER,   -- 收旧单号

p_GSID   VARCHAR2,    -- 公司代码

P_SPMS    VARCHAR2,   -- 收旧商品描述

p_SPBM  VARCHAR2,     -- 收旧商品码

P_PPB01  VARCHAR2,    -- 旧机品牌

P_SPFL01  varchar2,   -- 旧机品类

p_JJGG   varchar2,    -- 旧机规格

p_JJMS   varchar2,    -- 旧机描述

p_SPJE   varchar2,    -- 金额

p_KHDQ01 varchar2,    -- 区域代码

p_XH  INTEGER         -- 回执序号

                                        )

as

  v_Date           date;

  V_XXF1            NUMBER(16,4);

  V_XXF2            NUMBER(16,4);

   V_XXF3            NUMBER(16,4);

    V_XXF4            NUMBER(16,4);

 INTEGRITY_ERROR  EXCEPTION;

 ERRNO            INTEGER;

 ERRMSG           CHAR(200);

begin

 SELECT TRUNC(PWDSJ) INTO v_Date FROM SJD_PWD

   WHERE HSD01=p_HSD01 AND YXBJ=1; --用派网点时间取信息费

 

  IF GET_HSDZFBJ(p_HSD01)= 1 THEN

   ERRNO:= '-20003';

    ERRMSG := p_HSD01||' 号收旧单已作废,请重新查找需要回执的收旧单';

   RAISE INTEGRITY_ERROR;

 END IF;

/*优先取收旧商品的信息费:公司+区域+有效期+收旧商品->金额

           公司+有效期+收旧商品->金额

 

再取收旧商品品类的信息费:公司+区域+有效期+收旧品类->金额

公司+有效期+收旧品类->金额*/

 

 BEGIN

 BEGIN

  BEGIN

   BEGIN

    SELECT JE INTO V_XXF1 FROM (     -- 优先取收旧商品的信息费:公司+区域+有效期+收旧商品->金额

       SELECT JE FROM SJJGTCBZ

        WHERE GSXX01=p_GSID AND KHDQ01=p_KHDQ01 ANDSPBM=p_SPBM

          AND TRUNC(v_Date) >= YXQ_S

          AND TRUNC(v_Date) <= YXQ_E

          ORDER BY RQ DESC ) WHERE ROWNUM=1;

   INSERT INTOSJD_HZMX(HSD01,GSXX01,SPMS,XH,SPSL,XXF,SPBM,PPB01,SPFL01,JJGG,JJMS,SPJE)

   VALUES(p_HSD01,p_GSID,P_SPMS,p_XH+1,1,V_XXF1,p_SPBM,P_PPB01,P_SPFL01,p_JJGG,p_JJMS,p_SPJE);

      

 EXCEPTIONWHEN NO_DATA_FOUND THEN

       SELECT JE INTO V_XXF2 FROM (    -- 优先取收旧商品的信息费: 公司+有效期+收旧商品->金额

       SELECT JE FROM SJJGTCBZ

        WHERE GSXX01=p_GSID AND KHDQ01 IS NULL ANDSPBM=p_SPBM

          AND TRUNC(v_Date) >= YXQ_S

          AND TRUNC(v_Date) <= YXQ_E

          ORDER BY RQ DESC ) WHERE ROWNUM=1;

   INSERT INTOSJD_HZMX(HSD01,GSXX01,SPMS,XH,SPSL,XXF,SPBM,PPB01,SPFL01,JJGG,JJMS,SPJE)

   VALUES(p_HSD01,p_GSID,P_SPMS,p_XH+1,1,V_XXF2,p_SPBM,P_PPB01,P_SPFL01,p_JJGG,p_JJMS,p_SPJE);

   END;

  EXCEPTIONWHEN NO_DATA_FOUND THEN

       SELECT JE INTO V_XXF3 FROM (   --再取收旧商品品类的信息费:公司+区域+有效期+收旧品类->金额 

       SELECT JE FROM SJJGTCBZ

       WHERE GSXX01=p_GSID AND KHDQ01=p_KHDQ01  ANDSPFL01=P_SPFL01

          AND TRUNC(v_Date) >= YXQ_S

          AND TRUNC(v_Date) <= YXQ_E

          ORDER BY RQ DESC  ) WHERE ROWNUM=1;

     INSERT INTOSJD_HZMX(HSD01,GSXX01,SPMS,XH,SPSL,XXF,SPBM,PPB01,SPFL01,JJGG,JJMS,SPJE)

     VALUES(p_HSD01,p_GSID,P_SPMS,p_XH+1,1,V_XXF3,p_SPBM,P_PPB01,P_SPFL01,p_JJGG,p_JJMS,p_SPJE);

   END;

     

 EXCEPTIONWHENNO_DATA_FOUND THEN

    SELECT JE INTO V_XXF4 FROM (    --再取收旧商品品类的信息费: 公司+有效期+收旧品类->金额

       SELECT JE FROM SJJGTCBZ

       WHERE GSXX01=p_GSID AND KHDQ01 IS NULL  ANDSPFL01=P_SPFL01

          AND TRUNC(v_Date) >= YXQ_S

          AND TRUNC(v_Date) <= YXQ_E

          ORDER BY RQ DESC  ) WHERE ROWNUM=1;

     INSERT INTOSJD_HZMX(HSD01,GSXX01,SPMS,XH,SPSL,XXF,SPBM,PPB01,SPFL01,JJGG,JJMS,SPJE)

     VALUES(p_HSD01,p_GSID,P_SPMS,p_XH+1,1,V_XXF4,p_SPBM,P_PPB01,P_SPFL01,p_JJGG,p_JJMS,p_SPJE);

   END;

 

 INSERT_CRMJK(p_HSD01,4,'CRM293'); --回执传CRM

 

 EXCEPTION WHEN NO_DATA_FOUND THEN     -- 都未取到信息费

     ERRNO:= '-20003';

      ERRMSG := '未取到收旧信息费【售后公司:'||p_GSID||';旧机品类:'||P_SPFL01||

';区域:'||p_KHDQ01||';收旧商品:'||p_SPBM||'】';

     RAISE INTEGRITY_ERROR;  

   END;

 

EXCEPTION

   WHEN INTEGRITY_ERROR THEN

      RAISE_APPLICATION_ERROR(ERRNO, ERRMSG);

end;

 

 

 

 

 

 -- 第二种 写下

createor replace procedure EXEC_SJD_HZMX(p_WXDH INTEGER,

                                      p_KHBH INTEGER,

                                      p_GSID VARCHAR2,

P_HZR VARCHAR2,

p_HZGRDMVARCHAR2,

P_HZGRMCVARCHAR2,

P_WXKBM VARCHAR2,

P_NJTM  VARCHAR2,

P_WJTM  VARCHAR2,

P_JXH   VARCHAR2,

P_WXLX  NUMBER,

P_PJFY  FLOAT,

P_FWF   FLOAT,

P_WCQK  NUMBER,

P_WXFCB  FLOAT, --h.s.y add 20110422维修费成本

P_BZ     VARCHAR2 --W.K. add 20111213备注

                                      )

as

 v_PWDSJ          DATE;

 v_ISHF           NUMBER(8);

 V_YWLX           NUMBER(8);

 v_WDXZ           NUMBER(8);

 V_ISJS           NUMBER(8);

 V_SJLY           NUMBER(8);

 V_XXF            NUMBER(16,4);

 V_GYS            VARCHAR2(50);

 V_AZWD           VARCHAR2(50);

 v_SPFL           VARCHAR2(50);

 v_PP             VARCHAR2(50);

 V_WB_GSXX01      VARCHAR2(50);

 V_SPBM           VARCHAR2(50);

 IDJZT            NUMBER(8);

 INTEGRITY_ERROR  EXCEPTION;

 ERRNO            INTEGER;

 ERRMSG           CHAR(200);

begin

 v_ISHF := 0;

 BEGIN

   SELECT A.SPFL01,A.PPB01,A.WXLX,WB_GSXX01,DJZT,SPBM,SJLY

     INTO v_SPFL,v_PP,V_YWLX,V_WB_GSXX01,IDJZT,V_SPBM,V_SJLY

     FROM WXD_JD A

    WHERE WXD01=p_WXDH AND A.GSXX01=p_GSID;

 EXCEPTION

   WHEN NO_DATA_FOUND THEN

   ERRNO:= '-20003';

    ERRMSG := '此维修单的商品未找到品牌或品类';

   RAISE INTEGRITY_ERROR;

 END;

 IFIDJZT > 3 THEN

   ERRNO:= '-20001';

    ERRMSG := '此维修单的状态已改变,该单已回执,请确认!';

   RAISE INTEGRITY_ERROR;

 END IF;

 IF V_YWLX=2 AND V_YWLX<>P_WXLX THEN

   ERRNO:= '-20003';

    ERRMSG := '建档为保外业务类型,无法转换!';

   RAISE INTEGRITY_ERROR;

 END IF;

 

  IF P_WXLX IN (1,9) AND (V_SPBM IS NULL OR V_SPBM='') THEN--2012-12-19 11:40

   ERRNO:= '-20003';

    ERRMSG := '保内或自营延保维修商品编码不能为空!';

   RAISE INTEGRITY_ERROR;

 END IF;

 

  IF P_WXLX NOT IN (3,9,10) THEN  --非延保回执

   BEGIN

      SELECT A.WDXZ,B.YJWD01,TRUNC(B.PWDSJ) INTOV_WDXZ,V_AZWD,v_PWDSJ FROM AZWD A, WXD_PWD B--取一级网点

       WHERE A.AZWD01=B.AZWD01 AND A.GSXX01=B.GSXX01

         AND B.WXD01=p_WXDH AND B.YXBJ=1;

   EXCEPTION

     WHEN NO_DATA_FOUND THEN

     ERRNO:= '-20003';

      ERRMSG := '未找到所派网点的性质,请确认该网点是不是已停用!';

     RAISE INTEGRITY_ERROR;

   END;

 

    IF P_WCQK=0 THEN --只有维修完成时才校验结算标准

     IF P_WXLX<>8 THEN

SET_WXJXJSB(p_GSID,V_AZWD,V_WDXZ,v_SPFL,v_PP,P_WXLX,P_PJFY,P_FWF,V_WB_GSXX01,v_PWDSJ,V_XXF,V_ISJS,V_GYS);--获取信息费,是否传SAP

     END IF;

 

      IF P_WXLX=8 THEN--会员积分兑换h.s.y add 20110512

     V_XXF:=0;

     V_ISJS:=1;

     V_GYS:='G'||V_WB_GSXX01;

     END IF;

   ELSE

     V_XXF:=0;

     V_ISJS:=0;

     V_GYS:='';

   END IF;

 END IF;

 

 update WXD_HZ SETWXKBM=P_WXKBM,NJTM=p_NJTM,WJTM=p_WJTM,JXH=P_JXH,WXLX=P_WXLX,XXF=V_XXF,WXF=P_PJFY+P_FWF,PJFY=P_PJFY,FWF=P_FWF,WCQK=P_WCQK,WXFCB=P_WXFCB

            WHERE WXD01 =p_WXDH;

 if SQL%ROWCOUNT = 0 then

 insert into WXD_HZ (WXD01,KHZL01,GSXX01,HZR,HZRQ,HZGRDM,HZGRMC,

YXBJ,WXKBM,NJTM,WJTM,JXH,WXLX,XXF,WXF,PJFY,FWF,WCQK,WXFCB,ISJS,JSGYS,BZ)

             VALUES(p_WXDH,p_KHBH,p_GSID,P_HZR,SYSDATE,p_HZGRDM,P_HZGRMC,

1,P_WXKBM,p_NJTM,p_WJTM,P_JXH,P_WXLX,V_XXF,P_PJFY+P_FWF,P_PJFY,P_FWF,P_WCQK,P_WXFCB,V_ISJS,V_GYS,P_BZ);

 end if;

 UPDATE WXD_JD SET DJZT=4,ISHF=v_ISHF,DJZTBGSJ=SYSDATE,TS01=get_ts01 WHEREWXD01=p_WXDH;

  UPDATE WXD_PWD SET JSGYS=V_GYS WHERE WXD01=P_WXDH AND YXBJ=1AND JSGYS IS NULL;--三方回执的结算供应商更新到派网点表上便于查询

  ----结算不在金力作控制由CRM控制回执后传吉亚同时传CRM 待回访完后将结果回传CRM 2012.10.15

  IF P_WCQK = 0 AND P_WXLX<>3 THEN  --回执完成且非三方延保的进行回访

    EXEC_AZD_WXD_HF(p_GSID,P_WXDH,2,V_ISHF); --判断是否需要回访

 END IF;

 

 EXCEPTION

   WHEN INTEGRITY_ERROR THEN

      RAISE_APPLICATION_ERROR(ERRNO, ERRMSG);

 

end;





第一种当时也是为了,赶时间没有考虑阅读性就写成这样。第二种是经过修改后易于阅读和方便其他人维护。

说实话第一种写法虽然当时是写完了,也测试通过。但是本人也觉得阅读性不好,所以进行修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值