create or replace procedure rebuild_sic86_wyl(pi_aac001 in number,
po_fhz out varchar2,
po_msg out varchar2) is
--1.根据账户类型来判断是本地的还是转入的,
--2.如果是本地的,
-- 写一个游标存放sic86.截止上年末缴费月数jzsnm,本年度缴费月数bn,本年累计缴费月数bnnj,
-- 从最小的年份开始,清空最小年费的下一年jzsnm,bnlj
-- update sic86 set jzsnm = null ,bnlj = null where aae001 >min(aae001)
-- update 最小年费下一年的 jzsnm = 最小年份bn+bnlj
v_count number(4);
v_zhlx sic86.zhlx%type;
v_aae001_min sic86.aae001%type;
v_aae001_max sic86.aae001%type;
v_nf sic86.aae001%type;
v_bn sic86.bn%type;
v_bnlj sic86.bnlj%type;
v_jzsnm sic86.jzsnm%type;
cursor c_zhlx_list is
select zhlx from sic86 where aac001 = pi_aac001;
begin
po_fhz := '1';
po_msg := '修正成功';
for rec_zhlx in c_zhlx_list loop
--选取最小年份和最小年份
select min(aae001)
into v_aae001_min
from sic86
where aac001 = pi_aac001;
select min(aae001)
into v_aae001_max
from sic86
where aac001 = pi_aac001;
if rec_zhlx.zhlx = '0' then
for nf in v_aae001_min .. v_aae001_max loop
--去最小年份的本年缴费月数
select bn
into v_bn
from sic86
where aac001 = pi_aac001
and aae001 = nf;
--取最小年份的本年累计月数
select bnlj
into v_bnlj
from sic86
where aac001 = pi_aac001
and aae001 = nf;
--最小年份下一年 v_nf
v_nf := nf + 1; -- 修正1 最小年份下一年的的 jzsnm = 最小年度bn+最小年度bnlj
update sic86
set jzsnm =
(v_bn + v_bnlj)
where aac001 = pi_aac001
and aae001 = v_nf;
--取最小年份下一年的的截至上年末月数
select jzsnm
into v_jzsnm
from sic86
where aac001 = pi_aac001
and aae001 = v_nf;
-- po_msg :=v_nf||'年份的jzsnm='||v_jzsnm;
--return; --调试用,正式用的时候注释掉
--去最小年份下一年的本年缴费月数
select bn
into v_bn
from sic86
where aac001 = pi_aac001
and aae001 = v_nf; --清空最小年份下一年的 截至上年末月数 和 本年累计(其实清空不情况无所谓,不影响)
/*
update sic86
set jzsnm = null, bnlj = null
where aac001 = pi_aac001
and aae001 = v_nf;
*/ -- 修正2 最小年份下一年的 本年累计月数 bnlj = 本年的jzsnm+本年的bn
update sic86
set bnlj =
(v_jzsnm + v_bn)
where aac001 = pi_aac001
and aae001 = v_nf;
end loop;
po_fhz := '1';
po_msg := '循环修正成功';
elsif rec_zhlx.zhlx = '1' then
po_fhz := '-1';
po_msg := '转入的暂不处理';
return;
end if;
end loop;
end;

  以上只能修正最小年度的下一年。

以下是建表语句:

-- Create table
create table SIC86
(
jzsnm NUMBER(4),
bn NUMBER(4),
bnlj NUMBER(4),
zhlx VARCHAR2(2),
aac001 NUMBER(10),
aae001 NUMBER(4)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table SIC86
is '模拟养老年度账户';
-- Add comments to the columns
comment on column SIC86.jzsnm
is '截至上年末缴费月数';
comment on column SIC86.bn
is '本年缴费月数';
comment on column SIC86.bnlj
is '截止本年累计月数';
comment on column SIC86.zhlx
is '账户类型,0:本地; 1:转入生成';
comment on column SIC86.aac001
is '个人编号';

  最终的修正程序:

可以正常使用,要分两段,第一:最小年份的要单独更新 本年累计bnlj = 截至上年末 jzsnm+本年bn ;

            第二:最大年份的时候同上。

CREATE OR REPLACE PROCEDURE REBUILD_SIC86_WYL(PI_AAC001 IN NUMBER,
PO_FHZ OUT VARCHAR2,
PO_MSG OUT VARCHAR2) IS
--1.根据账户类型来判断是本地的还是转入的,
--2.如果是本地的,
-- 写一个游标存放sic86.截止上年末缴费月数jzsnm,本年度缴费月数bn,本年累计缴费月数bnnj,
-- 从最小的年份开始,清空最小年费的下一年jzsnm,bnlj
-- update sic86 set jzsnm = null ,bnlj = null where aae001 >min(aae001)
-- update 最小年费下一年的 jzsnm = 最小年份bn+bnlj
V_ZHLX SIC86.ZHLX%TYPE;
V_AAE001_MIN SIC86.AAE001%TYPE;
V_AAE001_MAX SIC86.AAE001%TYPE;
V_NF SIC86.AAE001%TYPE;
V_BN SIC86.BN%TYPE;
V_BNLJ SIC86.BNLJ%TYPE;
V_JZSNM SIC86.JZSNM%TYPE;
CURSOR C_ZHLX_LIST IS
SELECT ZHLX FROM SIC86 WHERE AAC001 = PI_AAC001;
BEGIN
PO_FHZ := '1';
PO_MSG := '修正成功'; FOR REC_ZHLX IN C_ZHLX_LIST LOOP
--选取最小年份和最小年份
SELECT MIN(AAE001)
INTO V_AAE001_MIN
FROM SIC86
WHERE AAC001 = PI_AAC001;
SELECT MAX(AAE001)
INTO V_AAE001_MAX
FROM SIC86
WHERE AAC001 = PI_AAC001; FOR NF IN V_AAE001_MIN .. V_AAE001_MAX LOOP
--修正01 最小年份的本年累计,只修正最小年份,只修正一次
IF (NF = V_AAE001_MIN) THEN
--取最小年份的截止上年末月数,这个只用一次
UPDATE SIC86
SET BNLJ =
(NVL(JZSNM, 0) + NVL(BN, 0))
WHERE AAC001 = PI_AAC001
AND AAE001 = NF;
ELSE
NULL;
END IF; --去最小年份的本年缴费月数
SELECT BN
INTO V_BN
FROM SIC86
WHERE AAC001 = PI_AAC001
AND AAE001 = NF;
--取最小年份的本年累计月数
SELECT BNLJ
INTO V_BNLJ
FROM SIC86
WHERE AAC001 = PI_AAC001
AND AAE001 = NF; --最小年份下一年 v_nf
V_NF := NF + 1; -- 修正1 最小年份下一年的的 jzsnm = 最小年度bnlj
UPDATE SIC86
SET JZSNM = V_BNLJ
WHERE AAC001 = PI_AAC001
AND AAE001 = V_NF;
--加入判断截至上年末下一年v_nf是否为最后一年,如果直接退出
IF V_NF = V_AAE001_MAX THEN
--取最小年份的截止上年末月数,这个只用一次
UPDATE SIC86
SET BNLJ =
(NVL(JZSNM, 0) + NVL(BN, 0))
WHERE AAC001 = PI_AAC001
AND AAE001 = V_NF;
PO_FHZ := '1';
PO_MSG := '修复成功';
RETURN;
END IF;
--取最小年份下一年的的截至上年末月数
SELECT JZSNM
INTO V_JZSNM
FROM SIC86
WHERE AAC001 = PI_AAC001
AND AAE001 = V_NF;
-- po_msg :=v_nf||'年份的jzsnm='||v_jzsnm;
--return; --调试用,正式用的时候注释掉
--去最小年份下一年的本年缴费月数
SELECT BN
INTO V_BN
FROM SIC86
WHERE AAC001 = PI_AAC001
AND AAE001 = V_NF; -- 修正2 最小年份下一年的 本年累计月数 bnlj = 本年的jzsnm+本年的bn
UPDATE SIC86
SET BNLJ =
(V_JZSNM + V_BN)
WHERE AAC001 = PI_AAC001
AND AAE001 = V_NF;
END LOOP;
PO_FHZ := '1';
PO_MSG := '循环修正成功';
END LOOP;
END;

  

循环调用修正sic86的更多相关文章

  1. 循环调用修正sic86 2改后的(除了第一年有点诡异,其他年份可以正常修复)

    create or replace procedure rebuild_sic86_wyl(pi_aac001 in number, po_fhz out varchar2, po_msg out v ...

  2. JSONP不支持循环调用

    问题描述 在jquery或zepto下,循环调用同一个jsonp ;i<;i++){ $.ajax({ url:'https://m.suning.com/authStatus?callback ...

  3. jmeter之regular expression extractor ,并循环调用匹配到的多个值

    jmeter之regular expression extractor 官方介绍:http://jmeter.apache.org/usermanual/regular_expressions.htm ...

  4. Oracle之带参存储过程(存储过程中for循环调用存储过程)

    --带参存储过程create or replace procedure testdate(v in number) is i number; begin i:=v; insert into test_ ...

  5. Python函数的循环调用

    def foo (): print 'runing foo' bar () def bar (): print 'runing bar' foo () bar() 直接上脚本,上面的脚本如果换成C语言 ...

  6. Sybase:循环调用存储过程

    Sybase:循环调用存储过程 一.日期循环 declare @c_count int declare @rq int --获取两个日期之间的天数 ,getdate()) begin ,),),),) ...

  7. jsonp 跨域只能调用一次ajax(无法多次调用或者循环调用)

    jsonp 跨域只能掉用一次ajax(无法多次调用或者循环调用) 百度搜索关键字:jsonp 只能调用一次ajax 解决方法 //回调函数设置,给后台执行        window[callback ...

  8. 使用jackson转json解决双向关联循环调用

    ITOO V1.0的开发算是告一段落了,现在是整理总结交接环节,在这个项目中常见的问题也该好好整理一下和大家分享了,这次主要介绍转json循环调用的问题. 一.问题背景 相信只要使用ORM映射实体关联 ...

  9. C# 函数方法内部实现循环调用自身

    //C# 函数方法内部实现循环调用自身 void TreeViewFresh(){ Action<TreeNodeCollection, MenuItem> addNode = (Tree ...

随机推荐

  1. HDU3535-AreYouBusy

    描述: As having become a junior, xiaoA recognizes that there is not much time for her to AC problems, ...

  2. linux和windows的文件互传

    Linux →→→Windows 1.使用secureCRT:下载文件只需在shell终端仿真器中输入命令"sz 文件名",即可利用Zmodem将文件下载到本地某目录下. 2. s ...

  3. Altium designer 10如何设置标题栏

    一.修改设置 1.执行Design-Document Option,打开文档属性对话框,设置其中title等参数. 2.执行Place-Text String,按TAB键,将Text属性中设置为&qu ...

  4. oracle命令大全

    内容包括三大项:    1.oracle基本操作语句 2.SQLServer基本操作语句 3.各种数据库连接方法 ******************************************* ...

  5. cocos2dx中的层CCLayer

    什么是层,层在cocos2dx里是一个能处理触摸事件的CCNode,因为它负责用户交互,因此大部分游戏细节都在这个类中完成,所以我们经常派生这个图层来完成逻辑交互代码.当然如果你的图层不需要接受交互信 ...

  6. cocos2d-x中的尺寸之三

    通过上面两个文章的分析,我们在这个博文里做个总结: CCEGLView::getFrameSize()返回的是窗口相对于屏幕像素的尺寸,这个尺寸,只要窗口没变化,值就不会变化 CCDirector:: ...

  7. 从Xib文件加载UIView的5种方式

    在不同的Xib文件中最容易维护的是定义的视图,因此对于从Xib文件中加载UIView来说一个方便的流程是非常重要. 在过去的几年里我发现唯一易于管理创建和维护视图(或者任何界面元素,通常会更多)方式就 ...

  8. 人类科技的发展为什么会是加速度的(TRIZ方法再推荐)

    从人类的历史发展来看,近200年来的科技发展的成果超过了过去几千年中科技发展的成果,并且从短时间来看.这样的加速趋势也是很明显的,想想十年前和如今的对照,科技的发展确实是日新月异. 科技的发展固然有偶 ...

  9. hadoop学习;安装jdk,workstation虚拟机v2v迁移;虚拟机之间和跨物理机之间ping网络通信;virtualbox的centos中关闭防火墙和检查服务启动

    JDK 在Ubuntu下的安装 与 环境变量的配置 前期准备工作: 找到  JDK 和 配置TXT文件  并拷贝到桌面下  不是目录 而是文件拷贝到桌面下 以下的命令部分就直接复制粘贴就能够了 1.配 ...

  10. HDU1029时钟(排序)

    题意:是用两个指针的一个模拟时钟的时针和分针.两个指针形成一个角度.角度测量两个指针之间的最小角度.两只手之间的角度是大于或等于0,且小于或等于180度的度量.由于一个序列的五个不同的写入时间,格式为 ...