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. 2.PHP 教程_PHP 安装

    您需要做什么? 找一个支持PHP和MySQL的主机 在您自己的PC机上安装web服务器,然后安装PHP和MySQL 使用支持PHP的Web的主机 如果您的服务器支持PHP,那么您不需要做任何事情. 只 ...

  2. Symfony命令行

    Available commands:  help                                  显示命令的帮助信息  list                           ...

  3. R语言学习笔记之外部文件读取

    在win32位的系统下,RODBC包内的函数是可以直接运行的,但在win64位的系统则不支持! 1.读取外部文件read.table()---csv,txt,excel 最基本函数是read.tabl ...

  4. wsdl透明解析

    1.逐个分析wsdl文件中的元素: <types>:数据类型定义的容器,一般使用 xml schema类型系统. <message>:通信消息的数据结构的抽象化定义,使用< ...

  5. .net mvc Authorization Filter,Exception Filter与Action Filter

    一:知识点部分 权限是做网页经常要涉及到的一个知识点,在使用MVC做权限设计时需要先了解以下知识: MVC中Url的执行是按照Controller->Action->View页面,但是我们 ...

  6. Qt 设置背景图片3种方法(QPalette可以做无数的事情,一旦控件指定了调色板,就要乖乖听它的话;QPainter当场绘制当然也没有问题,还有就是QSS)

    方法1. setStylSheet{"QDialog{background-image:url()"}}  //使用styleSheet 这种方法的好处是继承它的dialog都会自 ...

  7. png的格式及像素存储分析

    从图片的数据块存储方式来看png分两种 1.索引色模式存储.png8的索引色透明就采取该种方式.该种方式是将颜色存在png的可选模块调色板中,调色板的色彩存储格式为RGB(各1byte).而图片的数据 ...

  8. 移动开发语言Swift

    苹果公布了全新的编程语言Swift,Swift继承了Objective-C语言特性,并从Python和Java Script中长处,使Swift更易读.未来swift编程语言的会特大广大的使用 Swi ...

  9. Android 中文API (66) —— BluetoothClass.Device

    前言 本章内容是android.bluetooth.BluetoothClass.Device,为Android蓝牙部分的章节翻译,版本为Android 2.3   r1,翻译来自中山大学的" ...

  10. return view详解(转载)

    1.return View(); 返回值 类型:System.Web.Mvc.ViewResult将视图呈现给响应的 View() 结果. 注释 View() 类的此方法重载将返回一个具有空 View ...