- 论坛徽章:
- 0
|
有没有人愿意给俺一个oracle 存储过程的例子?多谢。。。
/*
----------------------------------文件头信息------------------------------
--文件名: TF_ACT_BAL_AC_B
--创建者: 刘英硕
--版本: v1.0
--日期: 2005-01-06
--
--功能描叙:帐户余额历史(act_bal_his)“拉链式begin date,end date”
-- 保存历史数据表ETL加工过程:
-- 0:假如因数据出错需重新运行,而必须删除目标表中的脏数据
-- 1:根据入口参数p_AreaNo判断该区域分行的原业务系统为NACS 或SBS
-- 2:保存该表上期数据的表act_bal_his(end_date='9999-01-01'),与
-- SBSCUT(SBS),ACSACT(NACS)表数据比较求出增量:
-- 2.1:一次求出当期新增的数据(N)和当期发生修改的数据(U),insert 到临时表
-- act_bal_his_tmp(delta_flag='U')
-- 2.2:当期已删除的数据(D),insert 到临时表
-- act_bal_his_tmp(delta_flag='D')
-- 3:将临时表act_bal_his_tmp的增量数据”加“到act_bal_his中
-- 3.1: 更新表 act_bal_his使enddate='本期批量开始日期前一天'
-- 条件:目标表的业务主键存在于临时表act_bal_his中,且
-- 目标表的enddate为‘9999-01-01'
-- 3.2: 将临时表act_bal_his_tmp中的当期新增的数据(N)和
-- 当期发生修改的数据(U)即(delta_flag='U')插入到表 act_bal_his
-- 使begindate='本期批量开始日期', enddate=‘9999-01-01'
--
--入口参数:
-- p_Period VARCHAR2( 期数
-- p_JobSeq NUMBER JOB执行序列号
-- p_AreaNo VARCHAR2(5) 区域编号
-- p_JobID VARCHAR2(10) JOB编号
--公共变量:
-- v_Period VARCHAR2( 期数
-- v_JobSeq NUMBER JOB执行序列号
-- v_AreaNo VARCHAR2(5) 区域编号
-- v_JobID VARCHAR2(10) JOB编号
-- v_RetCode NUMBER 错误号
-- v_Msg VARCHAR2(1000) 错误信息
-- v_BgnDate date 当期数据批量开始日期
-- v_EndDate date 当期数据批量结束日期
-- v_ LastEndDate date 上期数据批量结束日期
-- v_Sys_Flg 系统标识NACS或SBS
--执行命令:SQL>; execute TF_ACT_BAL_AC_B('20050101',100,'40004','J00001')
--修改历史:
--===== ============= ============================================
--Name Date Descriotion
---------------------------------------------------------------------------
*/
CREATE OR REPLACE PROCEDURE TF_ACT_BAL_AC_B(p_Period in VARCHAR2,
P_JobSeq in NUMBER,
p_AreaNo in VARCHAR2,
p_JobID in VARCHAR2)
IS
--声明变量
v_Period VARCHAR2( ;
v_JobSeq NUMBER;
v_AreaNo VARCHAR2(5);
v_JobID VARCHAR2(10);
v_Msg VARCHAR2(1000);
v_BgnDate date;
v_EndDate Date;
v_RetCode NUMBER;
v_LastEndDate date;
v_Sys_Flg VARCHAR(4);
v_Opt_flg VARCHAR2(1);
v_Def_date DATE;
v_Sql VARCHAR2(1000);
v_Orgidt VARCHAR2(4);
BEGIN
--------------公共变量赋值
v_Period:=p_Period;
v_JobSeq:=p_JobSeq;
v_AreaNo:=p_AreaNo;
v_JobID:=p_JobID;
v_Msg:='';
v_Opt_Flg:='U';
v_Def_Date:=trunc(TO_DATE('99990101','YYYY-MM-DD'));
v_Orgidt:=SUBSTR(v_AreaNO,2);
--从函数中得到v_BgnDate、和v_EndDate
v_BgnDate:=getBgnDate();
v_EndDate:=getEndDate();
v_LastEndDate:=v_BgnDate - 1;
--重做前的准备(调用存储过程,将ldm的数据恢复到前一期)
---------------------------------------
cleanDirtyData(v_Period,v_JobSeq,v_AreaNO,v_JobID,'act_bal_his','BEGIN',v_BgnDate,v_EndDate,v_RetCode);
IF v_RetCode <>; 0 THEN
RETURN;
END IF;
---------------------------------------
------------------------求出增量数据保存到临时表中----------------------
--数据来自NACS
--处理增量为新增和发生修改部分的数据
v_Msg:='1:insert ldm.act_bal_his_tmp ';
v_Sql:='INSERT INTO ldm.act_bal_his_tmp (RGN_NO,
ACNO,
ACT_BAL,
VLD_BAL,
DR_NINT_BAL,
CR_NINT_BAL,
DELTA_FLAG) ';
v_Sql:=v_Sql||'(SELECT :a,
ORGIDT||CUSIDT||APCODE||CURCDE,
BOKBAL,
AVABAL,
DIFBAL,
CIFBAL,
:b
FROM ods.ACSACT A,MISDEV.SYS_AREA B
WHERE A.REGCDE = B.AREANO
AND B.SUPERAREANO =:c
MINUS
SELECT RGN_NO,
ACNO,
ACT_BAL,
VLD_BAL,
DR_NINT_BAL,
CR_NINT_BAL,
:d
FROM ldm.ACT_BAL_HIS
WHERE rgn_no = :e
AND end_date =:f )';
EXECUTE IMMEDIATE v_Sql USING v_AreaNO,v_Opt_Flg,v_AreaNO,v_Opt_Flg,v_AreaNO,v_Def_Date;
--记录SQL语句操作情况
v_Msg:='SUCCESS:'||v_Msg||'ROWCOUNT='||SQL%ROWCOUNT;
writeDetailLog(v_Period,v_JobSeq,v_AreaNo,v_JobID,v_Msg);
--以下处理增量为已删除部分的数据
v_Msg:='2:insert ldm.act_bal_his_tmp ';
v_Opt_Flg:='D';
v_Sql:='INSERT INTO ldm.act_bal_his_tmp (RGN_NO,
ACNO,
DELTA_FLAG)
(SELECT RGN_NO,
ACNO,
:a
FROM ldm.ACT_BAL_HIS
WHERE rgn_no =:b
AND end_date =:c
MINUS
SELECT :d,
ORGIDT||CUSIDT||APCODE||CURCDE,
:e
FROM ods.ACSACT A,MISDEV.SYS_AREA B
WHERE A.REGCDE = B.AREANO
AND B.SUPERAREANO =:f )';
EXECUTE IMMEDIATE v_Sql USING v_Opt_Flg,v_AreaNO,v_Def_Date,v_AreaNO,v_Opt_Flg,v_AreaNO;
--记录SQL语句操作情况
v_Msg:='SUCCESS:'||v_Msg||'ROWCOUNT='||SQL%ROWCOUNT;
writeDetailLog(v_Period,v_JobSeq,v_AreaNo,v_JobID,v_Msg);
--将临时表中增量数据”加“到表ldm.act_bal_his
--将发生改变和已删除的数据以v_LastEndDate 结束
v_Msg:='3: update ldm.act_bal_his ';
v_Sql:='UPDATE ldm.act_bal_his A
SET A.end_date =:a
WHERE A.rgn_no =:b
AND A.end_date =:c
AND A.ACNO IN (SELECT B.ACNO
FROM ldm.act_bal_his_tmp B
WHERE B.RGN_NO =:d )';
EXECUTE IMMEDIATE v_Sql USING v_LastEndDate,v_AreaNo,v_Def_Date,v_Areano;
--记录SQL语句操作情况
v_Msg:='SUCCESS:'||v_Msg||'ROWCOUNT='||SQL%ROWCOUNT;
writeDetailLog(v_Period,v_JobSeq,v_AreaNo,v_JobID,v_Msg);
--将发生改变和新增的数据insert into ldm.act_bal_his
v_Msg:='4: insert ldm.act_bal_his ';
v_Opt_Flg:='U';
v_Sql:='INSERT INTO ldm.act_bal_his (RGN_NO,
ACNO,
BGN_DATE,
END_DATE,
ACT_BAL,
VLD_BAL,
DR_NINT_BAL,
CR_NINT_BAL)
SELECT RGN_NO,
ACNO,
:a,
:b,
ACT_BAL,
VLD_BAL,
DR_NINT_BAL,
CR_NINT_BAL
FROM ldm.act_bal_his_tmp
WHERE rgn_no =:c
AND delta_flag =:d ';
EXECUTE IMMEDIATE v_Sql USING v_BgnDate,v_Def_Date,v_AreaNo,v_Opt_Flg;
--记录SQL语句操作情况
v_Msg:='SUCCESS:'||v_Msg||'ROWCOUNT='||SQL%ROWCOUNT;
writeDetailLog(v_Period,v_JobSeq,v_AreaNo,v_JobID,v_Msg);
--写操作成功日志
writeOkLog(v_Period,v_JobSeq,v_AreaNo,v_JobID);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_retCode:=sqlcode;
v_Msg:='ERROR:'||v_Msg||'ERROR_CODE:'||v_retCode||SUBSTR(SQLERRM,1,800);
ROLLBACK;
errorHandle(v_Period,v_JobSeq,v_AreaNo,v_JobID,v_Msg);
RETURN;
END;
/ |
|