免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1954 | 回复: 2
打印 上一主题 下一主题

有没有人愿意给俺一个oracle 存储过程的例子?多谢。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-17 09:42 |只看该作者 |倒序浏览
好久没有弄过oracle啦,
突然又要使用oracle的存储过程,
语法斗忘记了,
哪位仁兄能帮我一把,
给我一个存储过程的例子,
最好是带异常处理的那种。。
再次谢谢啦。。。

论坛徽章:
0
2 [报告]
发表于 2005-05-17 10:06 |只看该作者

有没有人愿意给俺一个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;
/

论坛徽章:
0
3 [报告]
发表于 2005-05-17 10:06 |只看该作者

有没有人愿意给俺一个oracle 存储过程的例子?多谢。。。

看来魅力指数不够哈。。
不顾谢谢啦。。
凭着多年的积累我已经找到了我要找的东东。。
不用麻烦各位了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP