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. servlet同一用户的不同页面共享数据

    一.cookie技术 cookie的讲解和使用 --------------- 服务器在客户端保存用户的信息,比如登录名,密码等...就是cookie, 服务器端在需要时可以从客户端读取. cooki ...

  2. C++中的内存对齐

    在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度. 我们还是先来看一段简单的程序: 程序一 1 #include  ...

  3. 基于Visual C++2013拆解世界五百强面试题--题14-循环删除

    有一个数组a[1000]存放0-1000,要求每隔二个数删除一个数,到末尾时循环到开头继续进行,求最后一个被删掉数的原始下标. 看到题目可以用循环链表保存这些数,然后循环删除,大大减少了一些复杂的边界 ...

  4. makinacorpus/spynner

    makinacorpus/spynner Intro Contents Intro Credits Companies Authors Contributors Dependencies Feedba ...

  5. CF 459A(Pashmak and Garden-正方形给出2点求2点)

    A. Pashmak and Garden time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. Objective-c 类的继承 方法重写 方法重载

    一.类的继承 Objective-c中类的继承与C++类似,不同的是Objective-c不支持多重继承,一个类只能有一个父类,单继承使Objective-c的继承关系很简单,易于管理程序. Obje ...

  7. GDB命令行最基本操作

    程序启动: A.冷启动 gdb program              e.g., gdb ./cs gdb –p pid                 e.g., gdb –p `pidof c ...

  8. 把Orchard部署到Windows Azure Web Sites

    很久前就想做个人站点,主要用来记录自己的生活,我喜欢摄影,烘焙…然后又刚刚入皮坑,这些都可以放在网站上展示一下,或许还能为自己带来收入. 然后手上刚好有Azure的试用,于是乎动力就上来了. 以下是部 ...

  9. BZOJ 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛( LIS )

    裸的LIS ----------------------------------------------------------------- #include<cstdio> #incl ...

  10. Linux下载文件时报错 To connect to ohse.de insecurely, use ‘--no-check-certificate’.

    远程调用下载文件直接用wget就可以,一般文件路径类型是http.如果有遇到是https就会下载出错. 错误如下: [root@vmu010226-node1 tmp]# wget https://w ...