第一种写法:逻辑很复杂,不容易看懂(下面有第二种写法)
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;
第一种当时也是为了,赶时间没有考虑阅读性就写成这样。第二种是经过修改后易于阅读和方便其他人维护。
说实话第一种写法虽然当时是写完了,也测试通过。但是本人也觉得阅读性不好,所以进行修改。