您的位置:首页 > 数据库 > Oracle

oracle 集合变量以及自定义异常的用法

2016-08-10 11:28 961 查看
oracle 集合变量以及自定义异常的用法,

在过程 record_practice 有record变量和自定义异常的用法实例。具体在3284行。

CREATE OR REPLACE Package Pkg_Weiyl Is
Pkg_Name  Constant Varchar2(20) := 'pkg_weiyl';
Too_Young Constant Number := -20001;
Exc_Too_Young Exception;
Pragma Exception_Init(Exc_Too_Young, -20001);
Procedure Updateaae140(Pi_Aac002 In Varchar2,
Pi_Aae140 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Updateidcard(Pi_Bae007     In Varchar2,
Pi_Flag       In Varchar2,
Pi_Aac002     In Varchar2,
Pi_Aac002_New In Varchar2,
Pi_Aae013     In Varchar2,
Pi_Aae011     In Varchar2,
Pi_Bae001     In Varchar2,
Po_Fhz        Out Varchar2,
Po_Msg        Out Varchar2);
Procedure Cancelupdate(Pi_Bae007 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Updateidfh(Pi_Bae007 In Varchar2,
Pi_Aae012 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Validateidcard(Pi_Aac001     In Number,
Pi_Aac002_New In Varchar2,
Po_Fhz        Out Varchar2,
Po_Msg        Out Varchar2);
Procedure Vali_Idcard_Lenandchar(Pi_Aac002 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Updateidcard_Fortest(Pi_Aac002     In Varchar2,
Pi_Aac002_New In Varchar2,
Pi_Aae013     In Varchar2,
Pi_Aae011     In Varchar2,
Pi_Bae001     In Varchar2,
Po_Fhz        Out Varchar2,
Po_Msg        Out Varchar2);
--截取字符串 split_type 是自己建的类型  CREATE or replace type split_comma is table of varchar2(4000);
-- 取出字符串的方法 : select column_value from table (pkg_weiyl.split_dh('dd,aa,134'));
Function Split_Dh(p_Str       In Varchar2,
p_Delimiter In Varchar2 Default (',') --分隔符,默认逗号
) Return Split_Type;

Function Func_Wyl(Pi_Aaa100 Varchar2, Pi_Aaa102 Varchar2)
--字典转换,把代码值转换成对应的可理解的中文,卫永乐,20141105
Return Varchar2;
Function Func_Check_Para(Pi_Aab999 In Varchar2,
Pi_Pch    In Varchar2,
Pi_Aae001 In Number,
Pi_Aae036 In Varchar2,
Pi_Aac027 In Number)
/*拼接where条件 过程 check_sdnmdc 的游标的where条件*/
Return Varchar2;

/*
added 20160801
获取月份差值,主要针对于转移统计的
*/
function getMonthNum(pi_ksyf   in number,
pi_zzyf   in number,
pi_aae180 in number) return number;

Procedure Xjyyzf(Pi_Bae007 In Varchar2,
Pi_Operid In Varchar2,
Pi_Aae037 In Varchar2,
Pi_Aae038 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
--- 循环调用的过程,解决每次都要自己写一个declare plsql代码块,
--入参:
Procedure Prc_Xunhuan(Pi_Prcname In Varchar2, --要调用的过程名
Pi_Tabname In Varchar2, --cursor取值的表
Po_Fhz     Out Varchar2,
Po_Msg     Out Varchar2);
Procedure Xjyyzf_Callback(Pi_Bae007 In Varchar2,
Pi_Operid In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Xjyyzfqx(Pi_Bae007 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
-- 添加自治事务
Procedure Autonomous_Tran(Pi_Aac001 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
/*手工添加表级锁,使用场景,如果要操作一张大表的大部分数据,
如果不加表级锁,那么就会耗费大量的资源,这种情况下可以使用
手工给表加锁,释放方式 rollback,或者commit
*/
Procedure Update_Ac02_Aae140(Pi_Aae140 In Varchar2,
Pi_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);

Procedure Querycheck(Pi_Aac002 In Varchar2,
Pi_Aac003 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);

Procedure Check_Ac02(Pi_Aac002 In Varchar2,
Po_Aac001 Out Number,
Po_Cac012 Out Varchar2,
Po_Aab001 Out Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Check_Skc84(Pi_Aac001 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Check_Sdnmdcc(Pi_Aab999 In Varchar2,
PI_PCH    in varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Check_Sdnmdc(Pi_Bae001 In Varchar2,
Pi_Aab999 In Varchar2,
Pi_Pch    In Varchar2,
/* PI_GLT   in varchar2,*/
Pi_Aae001 In Varchar2,
Pi_Aae036 In Varchar2,
Pi_Aac027 In Varchar2,
Pi_Bzw    In Varchar2,
Pi_Oper   In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Check_Sdnmdc_Multi(Pi_Bae001 In Varchar2,
Pi_Aab999 In Varchar2,
Pi_Pch    In Varchar2,
/* PI_GLT   in varchar2,*/
Pi_Aae001 In Varchar2,
Pi_Aae036 In Varchar2,
Pi_Aac027 In Varchar2,
Pi_Bzw    In Varchar2,
Pi_Oper   In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Updatekbb5(Pi_Bae007 In Varchar2,
Pi_Ckz545 In Varchar2,
Pi_Ckb626 In Varchar2,
Pi_Ckb627 In Varchar2,
Pi_Ckb629 In Varchar2,
Pi_Ckb630 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Getaaz601(Pi_Rc     In Varchar2,
po_aaz601 out number,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
Procedure Insertfw_Zsk(PI_AAA200 in varchar2,
Pi_Aae202 In Varchar2,
Pi_Aaa203 In Varchar2,
Pi_Aae008 In Varchar2,
PI_AAE011 IN VARCHAR2,
PI_AAE906 IN VARCHAR2,
PI_BZ     IN VARCHAR2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2);
/*拼接两个字符串,练手嵌套存储过程*/
procedure testNestedPro(pi_xing   in varchar2,
pi_ming   in varchar2,
pi_aab001 in number,
po_fhz    out varchar2,
po_msg    out varchar2);
/*触摸屏查询标记*/
procedure cancelCmp(PI_SERIALNUM in varchar2,
po_fhz       out varchar2,
po_msg       out varchar2);
/*取消征集通知单*/
procedure cancelAaz288(PI_OPERID in varchar2,
PI_AAZ288 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
/*删除知识库核销的附件内容,否则数据里的不必要的附件会越来越多*/
procedure deleteZskFile(PI_CAE232 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
procedure generatexmmx(pi_ksrq in varchar2,
pi_zzrq in varchar2,
po_fhz  out varchar2,
po_msg  out varchar2);
procedure rebuild_sic86(pi_aac001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
procedure rebuild_ab07(pi_aab001 in varchar2,
pi_ksny   in varchar2,
pi_zzny   in varchar2,
pi_aae140 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);

/*Pkg_Ryhb_Pl_New
--批量合并,初始数据生成
Procedure Plhb_Start(Pi_Bae001 In Varchar2,
Pi_Aab001 In Number,
Pi_Jbr    In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2)
*/
procedure generate_plhb_data(pi_bae001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
procedure queryZSK(PI_AAE906 in varchar2,
PO_AAE202 out varchar2,
PO_AAE008 out varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
/*
生成失地农民汇总数据
by weiyongel 20160519
*/
procedure generate_sdnmhzsj(PI_BAE001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
/*
生成失地农民清理数据
by weiyongel 20160519
*/
procedure generate_sdnmqlsj(PI_BAE001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2);
/*生成失地农民数据清理后的变化字段,用于查询失地农民数据清理模块*/
procedure generate_sdnmdatachange(PI_AAC001 in varchar2,
PI_AAZ288 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);
/*检查ac35时间 ,增减员时用*/
procedure checkAC35Tim(PI_AAC002 in varchar2,
pi_aab999 in varchar2,
Po_AAE042 OUT varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);
/* 重新统计ac43 aae002 ,20160526 */
procedure cxtj_ac43(PI_AAB001 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);
procedure getAAC027(PI_AAC002 in varchar2,
PO_AAC027 OUT varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);
/* for test ,20160530 */
procedure myInsert(PI_AAC002 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);
/*统计 社会保险参保情况查询 */
procedure tongji_shbx_old(PI_AAC001 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);

/*统计 社会保险参保情况查询 2016081 */
procedure tongji_shbx(PI_AAC001 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2);

/*批量赋权限,我自己的权限放在表 fw_operator2right_wyl_ 中 */
procedure prc_right(pi_loginid       in varchar2,
pi_loginid_other in varchar2,
po_fhz           out varchar2,
po_msg           out varchar2);

/* 测试goto 的用法 */
procedure test_loop_go(pi_aab001 in number,
po_fhz    out varchar2,
po_msg    out varchar2);
/*
集合变量
*/
procedure record_practice(pi_aac001 in number,
po_fhz    out varchar2,
po_msg    out varchar2);

End Pkg_Weiyl;
/
CREATE OR REPLACE Package Body Pkg_Weiyl Is
c_Pkg_Name Constant Varchar2(20) := 'PKG_WEIYL';
--修改险种
Procedure Updateaae140(Pi_Aac002 In Varchar2,
Pi_Aae140 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Count Number(2);
Begin
Po_Fhz := '1';
Po_Msg := '成功';
Select Count(*) Into v_Count From Sab11 Where Bcc347 = Pi_Aac002;
If v_Count > 0 Then
Update Ac02
Set Aac008 = '2'
Where Aae140 = '342'
And Aac001 = (Select Aac001
From Ac01
Where Aac002 = Pi_Aac002
And Aae140 = Pi_Aae140);
End If;
Exception
When No_Data_Found Then
Po_Fhz := '0';
Po_Msg := '失败';
End Updateaae140;

--修改身份证号
Procedure Updateidcard(Pi_Bae007     In Varchar2,
Pi_Flag       In Varchar2,
Pi_Aac002     In Varchar2,
Pi_Aac002_New In Varchar2,
Pi_Aae013     In Varchar2,
Pi_Aae011     In Varchar2,
Pi_Bae001     In Varchar2,
Po_Fhz        Out Varchar2,
Po_Msg        Out Varchar2) Is
v_Aac001     Ac02.Aac001%Type;
v_Prc        Varchar2(20);
v_Aab001     Ac02.Aab001%Type;
v_Yl_Count   Number(2); --养老待遇记录数
v_Msg        Varchar2(200);
v_Aaa076     Ac60.Aaa076%Type;
v_Prcname    Varchar2(200);
v_Params     Varchar2(500);
v_Sqlerrm    Varchar2(500);
v_Aac003     Ac01.Aac003%Type;
v_Aac002_Tmp Ac01.Aac002%Type;
Begin
-- 初始化返回值
Po_Fhz    := '1';
Po_Msg    := '';
v_Prc     := '.updateIDCard';
v_Prcname := c_Pkg_Name || v_Prc;
v_Params  := ',传入参数为:pi_aac002=' || Pi_Aac002 || ',pi_aac002_new=' ||
Pi_Aac002_New || ',pi_aae013=' || Pi_Aae013 ||
',pi_aae011=' || Pi_Aae011 || ',pi_bae001=' || Pi_Bae001;
Select Aac001, Aab001
Into v_Aac001, v_Aab001
From Ac01
Where Aac002 = Pi_Aac002;
-- 调用校验过程进行判断
Validateidcard(v_Aac001, Pi_Aac002_New, Po_Fhz, Po_Msg);
If Po_Fhz <> '1' Then
Return;
End If;

-- 先做 是否有养老待遇的判断,如果有就直接返回,不更新ac01.aac002
Select Count(1) Into v_Yl_Count From Ac60 Where Aac001 = v_Aac001;
If v_Yl_Count > 0 Then
-- 如果有养老待遇,那么抛出更详细的结果,以便于前台更容易理解
-- 只取第一条
Select Aaa076
Into v_Aaa076
From Ac60
Where Aac001 = v_Aac001
And Rownum = 1;
Select Func_Wyl('AAA076', v_Aaa076) Into v_Msg From Dual;
Po_Fhz := '-2';
Po_Msg := v_Prcname || '执行失败,该人员存在养老待遇类型为 "' || v_Msg ||
'" 的养老待遇,且待遇状态正常,因此不能更新身份证';
Return;
End If;
-- 更新ac01.AAC002
Begin
-- 根据传入的标志来判断是该笔业务是改成正确身份证还是改成错误身份证,
If (Pi_Flag = '0') Then
/*v_aac002_tmp := BXGX_SEQ_aac002_tmp.Nextval||substr(pi_aac002,7,length(pi_aac002)-6);*/
v_Aac002_Tmp := Pi_Aac002_New;
Else
v_Aac002_Tmp := Pi_Aac002_New;
End If;
Update Ac01 Set Aac002 = v_Aac002_Tmp Where Aac001 = v_Aac001;
Exception
When Others Then
v_Sqlerrm := Substr(Sqlerrm, 1, 9);
/* 捕获,唯一性约束冲突*/
If v_Sqlerrm = 'ORA-00001' Then
Select Aac003
Into v_Aac003
From Ac01
Where Aac002 = Pi_Aac002_New;
Po_Fhz := v_Prcname || '_-3';
Po_Msg := '系统里已经存在身份证为' || Pi_Aac002_New || '的参保人了,姓名:' ||
v_Aac003 || ',因此不能修改';
Elsif v_Sqlerrm <> 'ORA-00001' Then
/*SQLERRM=ORA-00001*/
/*没法成功捕捉到sqlerrm*/
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Po_Fhz := v_Prcname || '_94';
End If;

--po_msg := pkg_fun.F_ERRMSG(v_prcName,sqlcode,sqlerrm,v_params);
--po_fhz := v_prcName||'_91';
Return;
End;
Insert Into Ac25
(Aaz163,
Bae001,
Aab001,
Aac001,
Cae129,
Aac050,
Aae160,
Cac038,
Bae007,
Aae011,
Aae036,
Bce326,
Aae012,
Bhe949,
Cae030,
Cae031,
Aae013,
Aac002,
Aac002_New)
Values
(Seq_Bxgx_Aaz163.Nextval, --使用原来的序列号
Pi_Bae001,
v_Aab001,
v_Aac001,
To_Char(Sysdate, 'yyyymm'),
'50', -- 50,变更类型为 修改资料
'1933', -- 1933,变更原因, 其它
'',
/*seq_ac25_bae007.nextval,*/ -- 业务流水号
Pi_Bae007,
Pi_Aae011,
To_Char(Sysdate, 'yyyymmddhh24miss'),
'0',
'',
To_Char(Sysdate, 'yyyymmddhh24miss'),
'',
'',
Pi_Aae013,
Pi_Aac002,
v_Aac002_Tmp);
Update Ac01 Set Aac002 = Pi_Aac002 Where Aac002 = v_Aac002_Tmp;
Exception
When No_Data_Found Then
-- Sqlcode, Sqlerrm
Po_Fhz := '-1';
Po_Msg := '过程' || Pkg_Name || v_Prc || '报错,ac01表里没有找到该人员';
End Updateidcard;

Procedure Cancelupdate(Pi_Bae007 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Aac002  Ac01.Aac002%Type;
v_Aac002y Ac25.Aac002%Type;
Begin
-- 初始化返回值

Po_Fhz := '-1';
Po_Msg := '退单失败';
Select a.Aac002_New
Into v_Aac002
From Ac25 a
Where a.Bae007 = Pi_Bae007;
Select a.Aac002 Into v_Aac002y From Ac25 a Where a.Bae007 = Pi_Bae007;
-- 更新复核标志
update ac25 set bce326 = '9' where bae007 = Pi_Bae007;
Begin
Update Ac01 Set Aac002 = v_Aac002y Where Aac002 = v_Aac002;
Po_Fhz := '1';
Po_Msg := '成功';
Exception
When Others Then
Po_Fhz := '-2';
Po_Msg := '退单失败2';
End;

End;

Procedure Updateidfh(Pi_Bae007 In Varchar2,
Pi_Aae012 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_aac002 ac01.aac002%type;
v_cnt    number(2);
Begin
-- 初始化返回值
Po_Fhz := '-1';
Po_Msg := '添加复核人';
Begin
Update Ac25
Set Aae012 = Pi_Aae012, Bce326 = '1'
Where Bae007 = Pi_Bae007;
select count(1)
into v_cnt
from ac01
where aac002 in
(Select Aac002_New From Ac25 Where Bae007 = Pi_Bae007);
if v_cnt > 0 then
Select Aac002_New into v_aac002 From Ac25 Where Bae007 = Pi_Bae007;
Po_Fhz := '-2';
Po_Msg := '修改后的新身份证号' || v_aac002 ||
',在新系统已经存在,请回退重新办理!pkg_weiyl.Updateidfh ,Pi_Bae007:' ||
Pi_Bae007 || ',Pi_Aae012:' || Pi_Aae012;
return;
else
Update Ac01
Set Aac002 =
(Select b.Aac002_New From Ac25 b Where Bae007 = Pi_Bae007)
Where Aac002 = (Select Aac002 From Ac25 Where Bae007 = Pi_Bae007);
end if;

Po_Fhz := '1';
Po_Msg := '添加复核人成功';
End;
Exception
When Others Then
Po_Fhz := '-1';
Po_Msg := '添加复核人失败,pkg_weiyl.Updateidfh ,Pi_Bae007:' || Pi_Bae007 ||
',Pi_Aae012:' || Pi_Aae012;
End Updateidfh;
--身份证校验,把医保局,信息中心提出的身份证修改的条件 分出来,单独校验
--身份证校验,把医保局,信息中心提出的身份证修改的条件 分出来,单独校验
Procedure Validateidcard(Pi_Aac001     In Number,
Pi_Aac002_New In Varchar2,
Po_Fhz        Out Varchar2,
Po_Msg        Out Varchar2) Is
v_Prcname        Varchar2(200) := c_Pkg_Name || '.validateIDCARD';
v_Params         Varchar2(500) := 'pi_aac001=' || Pi_Aac001;
v_Aae240         Skc81.Aae240%Type;
v_Lc31_Count     Number(2);
v_Count_Skc81    Number(2);
v_Aac002_Tmp     Ac25.Aac002_New%Type;
v_Count_Cardinfo Number(2);
v_Count_Ac60     Number(2);
v_Count_Kc21     Number(2);
/*function validate_aac002 return varchar2 is
v_aac002_new ac25.aac002_new%type;
v_aac002_after number(20);
begin
select a.aac002_new into v_aac002_new from ac25 a where a.aac001 = pi_aac001;
v_aac002_after := to_number(v_aac002_new);
return '1';
exception
when others then
return '-1';
end;*/
Begin
-- 初始化
Po_Fhz := '1';
-- 对修改后的身份证进行校验,防止不是纯数字,长度已经在前台进行了校验
Vali_Idcard_Lenandchar(Pi_Aac002_New, Po_Fhz, Po_Msg);
If Po_Fhz <> '1' Then
Return;
End If;

-- 1 医保局提出的要求,如果skc81.aae240>0 ,余额大于0 就不让改身份证。
Begin
-- 先要判断是否 skc81 是否有数据,有的话在判断 skc81.aae240是否大于0 ,如果skc81 没有数据的话 就不查 余额
Select Count(*)
Into v_Count_Skc81
From Skc81 a
Where a.Aac001 = Pi_Aac001;
If v_Count_Skc81 > 0 Then
Select Nvl(a.Aae240, 0)
Into v_Aae240
From Skc81 a
Where a.Aac001 = Pi_Aac001;
If v_Aae240 > 0 Then
/*po_fhz := v_prcName || '_91,医疗账户余额为' || v_aae240 || '元 ,因此不允许修改';*/
Po_Fhz := v_Prcname ||
'_91,职工医疗账户不为0,此模块不允许修改身份证号,请到本人参保地核实身份证号在其他业务模块办理!';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Return;
/*享受五险待遇的不能修改,所以包括了失业  享受五险待遇的不能修改,
所以包括了失业  没办卡,又享受了失业待遇的 而且个人医保账户为0的*/
--如果账户小于0,且
Elsif v_Aae240 <= 0 Then
Begin
Select Aac002
Into v_Aac002_Tmp
From Ac01
Where Aac001 = Pi_Aac001;
Select Count(*)
Into v_Count_Cardinfo
From Card_Info a
Where a.Idcard = v_Aac002_Tmp;
If v_Count_Cardinfo = 0 Then
--如果没有卡信息,然后再对五险进行判断,
--add 20150224 有卡也要进行判断
Select Count(*)
Into v_Count_Ac60
From Ac60
Where Aaa076 In ('0401',
'0403',
'0404',
'0411',
'0421',
'0702',
'0810',
'0821')
And Aae116 <> 4
And Aac001 = Pi_Aac001;
If v_Count_Ac60 > 0 Then
Po_Fhz := v_Prcname || '_-92,' ||
'该人员没有卡信息,但是有享受待遇,不能修改身份证,请到本人参保地核实身份证号在其他业务模块办理!!';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname,
Sqlcode,
Sqlerrm,
v_Params);
Return;
End If;
--add 20150224 有卡也要进行判断
Elsif v_Count_Cardinfo > 0 Then
Select Count(*)
Into v_Count_Ac60
From Ac60
Where Aaa076 In ('0401',
'0403',
'0404',
'0411',
'0421',
'0702',
'0810',
'0821')
And Aae116 <> 4
And Aac001 = Pi_Aac001;
If v_Count_Ac60 > 0 Then
Po_Fhz := v_Prcname || '_-92,' ||
'该人员有卡信息,且有享受待遇,不能修改身份证,请到本人参保地核实身份证号在其他业务模块办理!';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname,
Sqlcode,
Sqlerrm,
v_Params);
Return;
End If;
End If;
Exception
When No_Data_Found Then
Po_Fhz := v_Prcname || '_-91,没有找到该人员的基本信息';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname,
Sqlcode,
Sqlerrm,
v_Params);
End;
End If;
End If;

End;
-- 2 信息中心提出的要求,有工伤认定的,也不允许修改
Begin
Select Count(*) Into v_Lc31_Count From Lc31 Where Aac001 = Pi_Aac001;
If v_Lc31_Count > 0 Then
Po_Fhz := v_Prcname ||
'_92,该人员存在工伤认定记录,不能修改身份证,请到本人参保地核实身份证号在其他业务模块办理!';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Return;
End If;
End;

-- 3 住院的不能修改身份证,
Begin
Select Count(1)
Into v_Count_Kc21
From Kc21
Where Aac001 = Pi_Aac001
And Ckc544 = '1';
If v_Count_Kc21 > 0 Then
/*po_fhz := v_prcName||'_-93,该人员存在在院记录,不允许修改身份证!';*/
Po_Fhz := '_-93,该人员存在在院记录,不能修改身份证,请到本人参保地核实身份证号在其他业务模块办理!';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Rollback;
Return;
End If;
End;

Exception
When Others Then
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Po_Fhz := '-1';
End Validateidcard;
/*校验身份证是否合法,包括长度,身份证字母*/
Procedure Vali_Idcard_Lenandchar(Pi_Aac002 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Aac002   Ac01.Aac002%Type;
v_Count    Number(2);
v_Params   Varchar2(500) := ',传入参数 pi_aac002 = ' || Pi_Aac002;
v_Procname Varchar2(50) := c_Pkg_Name || '.vali_IdCard_lenAndChar';
v_Aac002_n Number(20); -- 数值型,用于接收转换后的身份证号
v_Char     Varchar2(2); -- 用于接收字符
v_Char2    Varchar2(2);
Begin
-- 初始化返回值
Po_Fhz := '1';
Po_Msg := Pkg_Fun.f_Errmsg(v_Procname, Sqlcode, Sqlerrm, v_Params);
Select Count(*) Into v_Count From Ac01 Where Aac002 = Pi_Aac002;
If v_Count > 0 Then
Select Trim(Pi_Aac002) Into v_Aac002 From Dual;
-- 检查是否为18位
If Length(v_Aac002) <> 18 Then
Po_Fhz := v_Procname || '_-91,身份证长度不为18位';
Po_Msg := Pkg_Fun.f_Errmsg(v_Procname, Sqlcode, Sqlerrm, v_Params);
Return;
End If;
Begin
-- 检查前17位是否有字母
v_Aac002   := Substr(v_Aac002, 1, Length(v_Aac002) - 1);
v_Aac002_n := To_Number(v_Aac002);
Exception
When Value_Error Then
Po_Fhz := v_Procname || '_-92,身份证的前17位中含有非数值型字符';
Po_Msg := Pkg_Fun.f_Errmsg(v_Procname, Sqlcode, Sqlerrm, v_Params);
Return;
End;
-- 如果最后一位是字母,;
Begin
-- 检查前17位是否有字母
Select Trim(Aac002)
Into v_Aac002
From Ac01
Where Aac002 = Pi_Aac002;
v_Aac002   := Substr(v_Aac002, Length(v_Aac002), 1);
v_Aac002_n := To_Number(v_Aac002);
Exception
When Value_Error Then
-- 说明最后一位是字母
-- 如果最后一位是字母,检查最后一位数是否为x;
Select Chr(88) Into v_Char From Dual;
Select Upper((Substr(v_Aac002, Length(v_Aac002), 1)))
Into v_Char2
From Dual; --存放截取的最后一位字符
If v_Char2 <> v_Char Then
Po_Fhz := v_Procname || '_-93,身份证的最后一位不是大写的X';
Po_Msg := Pkg_Fun.f_Errmsg(v_Procname,
Sqlcode,
Sqlerrm,
v_Params);
Return;
End If;
End;
End If;
Exception
When Others Then
Po_Fhz := v_Procname || '_-94,未知错误';
Po_Msg := Pkg_Fun.f_Errmsg(v_Procname, Sqlcode, Sqlerrm, v_Params);
End Vali_Idcard_Lenandchar;

--修改身份证号
Procedure Updateidcard_Fortest(Pi_Aac002     In Varchar2,
Pi_Aac002_New In Varchar2,
Pi_Aae013     In Varchar2,
Pi_Aae011     In Varchar2,
Pi_Bae001     In Varchar2,
Po_Fhz        Out Varchar2,
Po_Msg        Out Varchar2) Is
v_Aac001   Ac02.Aac001%Type;
v_Prc      Varchar2(200);
v_Aab001   Ac02.Aab001%Type;
v_Yl_Count Number(2); --养老待遇记录数
v_Msg      Varchar2(200);
v_Aaa076   Ac60.Aaa076%Type;
v_Prcname  Varchar2(200);
v_Params   Varchar2(500);
Begin
-- 初始化返回值
Po_Fhz    := '1';
Po_Msg    := '';
v_Prc     := '.updateIDCard_fortest';
v_Prcname := c_Pkg_Name || v_Prc;
v_Params  := ',传入参数为:pi_aac002=' || Pi_Aac002 || ',pi_aac002_new=' ||
Pi_Aac002_New || ',pi_aae013' || Pi_Aae013 ||
',pi_aae011=' || Pi_Aae011 || ',pi_bae001=' || Pi_Bae001;
Select Aac001, Aab001
Into v_Aac001, v_Aab001
From Ac01
Where Aac002 = Pi_Aac002;
-- 先做 是否有养老待遇的判断,如果有就直接返回,不更新ac01.aac002
Select Count(1) Into v_Yl_Count From Ac60 Where Aac001 = v_Aac001;
If v_Yl_Count > 0 Then
-- 如果有养老待遇,那么抛出更详细的结果,以便于前台更容易理解
-- 只取第一条
Select Aaa076
Into v_Aaa076
From Ac60
Where Aac001 = v_Aac001
And Rownum = 1;
Select Func_Wyl('AAA076', v_Aaa076) Into v_Msg From Dual;
Po_Fhz := '-1';
Po_Msg := Pkg_Name || v_Prc ||
'执行失败,该人员有待遇享受信息,此模块不允许修改身份证号!养老待遇类型为 "' || v_Msg ||
'" 的养老待遇,且待遇状态正常';
Return;
End If;
-- 更新ac01.AAC002
Update Ac01 Set Aac002 = Pi_Aac002_New Where Aac001 = v_Aac001;
Insert Into Ac25
(Aaz163,
Bae001,
Aab001,
Aac001,
Cae129,
Aac050,
Aae160,
Cac038,
Bae007,
Aae011,
Aae036,
Bce326,
Aae012,
Bhe949,
Cae030,
Cae031,
Aae013)
Values
(Seq_Bxgx_Aaz163.Nextval, --使用原来的序列号
Pi_Bae001,
v_Aab001,
v_Aac001,
'201310',
'50', -- 50,变更类型为 修改资料
'1933', -- 1933,变更原因, 其它
'',
'99999999', -- 业务流水号
Pi_Aae011,
To_Char(Sysdate, 'yyyymmddhh24miss'),
'1',
Pi_Aae011,
To_Char(Sysdate, 'yyyymmddhh24miss'),
'',
'',
Pi_Aae013);

Exception
When No_Data_Found Then
-- Sqlcode, Sqlerrm
Po_Fhz := v_Prcname || '_01';
Po_Msg := '过程' || Pkg_Name || v_Prc || '报错,ac01表里没有找到该人员,sqlcode:' ||
Sqlcode || ',sqlerrm:' || Sqlerrm;
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Return;
End Updateidcard_Fortest;

-- 截取字符串
--  create or replace type split_type is table of varchar2(4000)
-- 取出字符串的方法 : select column_value from table (pkg_weiyl.split_dh('dd,aa,134'));
Function Split_Dh(p_Str       In Varchar2,
p_Delimiter In Varchar2 Default (',') --分隔符,默认逗号
) Return Split_Type Is
j        Int := 0;
i        Int := 1;
Len      Int := 0;
Len1     Int := 0;
Str      Varchar2(4000);
My_Split Split_Type := Split_Type();
Begin
-- 要分割的字符串的长度
Len := Length(p_Str);
-- 分隔符的长度
Len1 := Length(p_Delimiter);

While j < Len Loop
j := Instr(p_Str, p_Delimiter, i);

If j = 0 Then
j   := Len;
Str := Substr(p_Str, i);
My_Split.Extend;
My_Split(My_Split.Count) := Str;

If i >= Len Then
Exit;
End If;
Else
Str := Substr(p_Str, i, j - i);
i   := j + Len1;
My_Split.Extend;
My_Split(My_Split.Count) := Str;
End If;
End Loop;

Return My_Split;
End Split_Dh;

--字典转换,把代码值转换成对应的可理解的中文,卫永乐,20141105
Function Func_Wyl(Pi_Aaa100 Varchar2, Pi_Aaa102 Varchar2) Return Varchar2 Is
v_Aaa103 Varchar2(1000);
Begin
Select Aaa103
Into v_Aaa103
From Aa10 a
Where a.Aaa100 = Pi_Aaa100
And a.Aaa102 = Pi_Aaa102;
Return v_Aaa103;
Exception
When No_Data_Found Then
Dbms_Output.Put_Line('没有找到数据');
End;

Function Func_Check_Para(Pi_Aab999 In Varchar2, --单位编号
Pi_Pch    In Varchar2, --批次号
Pi_Aae001 In Number,
Pi_Aae036 In Varchar2,
Pi_Aac027 In Number)
/*拼接where条件 过程 check_sdnmdc 的游标的where条件*/
Return Varchar2 Is
v_where varchar2(500);
Begin
/*v_where := ' where 1=1 and ';*/
v_where := ' null or 1=1 ';
/*Select * From v_sdnm_sjql_dc Where Aab999 = To_Char(Pi_Aab999);*/

if pi_aab999 <> '0' then
v_where := v_where || ' and aab999=''' || pi_aab999 || '''';
elsif Pi_Aab999 = '0' then
v_where := ' null or 1=1 ';
end if;
if Pi_Aae001 <> '0' then
v_where := v_where || ' and aae001=' || pi_aae001;
/*elsif Pi_Aae001 = '0' then
v_where := v_where||' and aae001='||pi_aae001;*/
end if;
if Pi_Aae036 <> '0' then
v_where := v_where || ' and substr(aae036,1,6)=''' || Pi_Aae036 || '''';
/*elsif Pi_Aae036 = '0' then
v_where := v_where||' and substr(aae036,1,6)='''||Pi_Aae036||'''';*/
end if;
if Pi_Aac027 <> '0' then
v_where := v_where || ' and aac027=' || Pi_Aac027 || ' ';
end if;
Return v_where;
End Func_Check_Para;

/*
added 20160801
获取月份差值,主要针对于转移统计的
*/
function getMonthNum(pi_ksyf   in number,
pi_zzyf   in number,
pi_aae180 in number) return number is
v_mon number(3);

begin
/*
如果 sac14 的 aae041 201601 ,aae042 201602 ,aae180 0 ,这种情况总的月份 就算是0 ,(201602-201601+1)*aae180
否则 就算是201602-201601+1 = 2 ;
*/
if nvl(pi_aae180, 0) != 0 and pi_zzyf >= pi_ksyf then
v_mon := pi_zzyf - pi_ksyf + 1;
else
v_mon := 0;
end if;
return v_mon;
end getMonthNum;

--县级公立医院支付
Procedure Xjyyzf(Pi_Bae007 In Varchar2,
Pi_Operid In Varchar2,
Pi_Aae037 In Varchar2,
Pi_Aae038 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Bae007 Skc70.Bae007%Type;
v_Time   Skc70.Aae015%Type;
Cursor c_Bae007 Is
Select Column_Value From Table(Pkg_Weiyl.Split_Dh(Pi_Bae007));
Begin
Po_Msg := '成功';
Po_Fhz := '1';
Select To_Char(Sysdate, 'yyyymmddhh24miss') Into v_Time From Dual;

For v_Bae007 In c_Bae007 Loop
-- 清空改经办人的临时表
Delete From t_Skc70 a
Where a.Bae007 = Pi_Bae007
And a.Aae011 = Pi_Operid;
Insert Into t_Skc70
(Bae007, Aae011)
Values
(v_Bae007.Column_Value, Pi_Operid);
Update Skc70
Set Aae117 = '1',
Cae295 = Pi_Operid,
Aae015 = v_Time,
Aae037 = Substr(Pi_Aae037, 1, 8),
Aae038 = Substr(Pi_Aae038, 1, 8)
Where Bae007 = v_Bae007.Column_Value;
End Loop;
Exception
When Others Then
Rollback;
Po_Msg := '失败';
Po_Fhz := '-1';
End Xjyyzf;

--- 循环调用的过程,解决每次都要自己写一个declare plsql代码块,
--入参:还没写完

Procedure Prc_Xunhuan(Pi_Prcname In Varchar2, --要调用的过程名
Pi_Tabname In Varchar2, --cursor取值的表
Po_Fhz     Out Varchar2,
Po_Msg     Out Varchar2) Is
v_Prcname Varchar2(400) := '.prc_xunhuan';
v_Params  Varchar2(200) := 'pi_prcName=' || Pi_Prcname ||
',pi_tabName:' || Pi_Tabname;
/*cursor cur_xunhuan is
select * from pi_tabName where aac001 = '';*/
Begin

Null;
Exception
When Others Then
Po_Fhz := '';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
End;
Procedure Xjyyzf_Callback(Pi_Bae007 In Varchar2,
Pi_Operid In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Bae007 Skc70.Bae007%Type;
v_Time   Skc70.Aae015%Type;
Cursor c_Bae007 Is
Select Column_Value From Table(Pkg_Weiyl.Split_Dh(Pi_Bae007));
Begin
Po_Msg := '成功';
Po_Fhz := '1';
For v_Bae007 In c_Bae007 Loop
-- 清空改经办人的临时表
Delete From t_Skc70 a
Where a.Bae007 = v_Bae007.Column_Value
And a.Aae011 = Pi_Operid;
End Loop;
Exception
When Others Then
--rollback;
Po_Msg := '失败';
Po_Fhz := '-1';
End Xjyyzf_Callback;

--县级公立医院支付取消
Procedure Xjyyzfqx(Pi_Bae007 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Bae007 Skc70.Bae007%Type;
Cursor c_Bae007 Is
Select Column_Value From Table(Pkg_Weiyl.Split_Dh(Pi_Bae007));
Begin
Po_Msg := '成功';
Po_Fhz := '1';
For v_Bae007 In c_Bae007 Loop
--清空临时表
Delete From t_Skc70 Where Bae007 = v_Bae007.Column_Value;
Update Skc70 Set Aae117 = '0' Where Bae007 = v_Bae007.Column_Value;
End Loop;
Exception
When Others Then
Po_Msg := '失败';
Po_Fhz := '-1';
End Xjyyzfqx;
/*自治事务*/
Procedure Autonomous_Tran(Pi_Aac001 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
Pragma Autonomous_Transaction; --自治事务关键字
v_Proname Varchar2(400);
v_Aab001  Number(20);
Begin
Po_Fhz   := '1';
Po_Msg   := '成功!';
v_Aab001 := Seq_Bxgx_Aab001.Nextval;
Insert Into Xzl_One (Aac002) Values (v_Aab001); -- v_aab001 是number,竟然可以插入varchar2类型字段
--commit;
Update Xzl_One
Set Aac003 =
(v_Aab001 || '姓名')
Where Aac002 = v_Aab001 || ''; --但是查却没法查到
Commit;
Exception
When Others Then
Rollback;
Po_Fhz := '-1';
Po_Msg := '失败,' || Sqlcode || ',sqlerrm:' || Sqlerrm;
Return;
End Autonomous_Tran;
/*手工添加表级锁,使用场景,如果要操作一张大表的大部分数据,
如果不加表级锁,那么就会耗费大量的资源,这种情况下可以使用
手工给表加锁,释放方式 rollback,或者commit
使用目的:更改 ac02_tmp表 的险种状态,ac02_tmp 表结构和数据
和ac02的一样
*/
Procedure Update_Ac02_Aae140(Pi_Aae140 In Varchar2,
Pi_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
Cursor Cur_Ac02 Return Ac02_Tmp%Rowtype Is
Select * From Ac02_Tmp Where Aae140 = Pi_Aae140;
v_Cur_Ac02 Ac02_Tmp%Rowtype;
Begin
--sys.dbms_profiler.start_profiler;
Lock Table Ac02_Tmp In Exclusive Mode Nowait;
Open Cur_Ac02;
Loop
Fetch Cur_Ac02
Into v_Cur_Ac02;
Exit When Cur_Ac02%Notfound; --检查是否找到,
-- 找到的话就就更新
Update Ac02_Tmp
Set Aac008 = '8'
Where Aae140 = Pi_Aae140
And Aac008 = '2';
Null;
End Loop;
Close Cur_Ac02;
Commit; --释放表级锁
--sys.dbms_profiler.stop_profiler;
End Update_Ac02_Aae140;

Procedure Querycheck(Pi_Aac002 In Varchar2,
Pi_Aac003 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Count Number(2);
Begin
--初始化返回值
Po_Fhz := '-1';
Po_Msg := '失败,该人员没有卡信息';
If Pi_Aac002 = '0' Then
Select Count(*) Into v_Count From Card_Info Where Name = Pi_Aac003;
If v_Count > 0 Then
Po_Fhz := '1';
Po_Msg := '成功';
End If;
End If;
If Pi_Aac003 = '0' Then
Select Count(*) Into v_Count From Card_Info Where Idcard = Pi_Aac002;
If v_Count > 0 Then
Po_Fhz := '1';
Po_Msg := '成功';
End If;
End If;
End;
Procedure Check_Ac02(Pi_Aac002 In Varchar2,
Po_Aac001 Out Number,
Po_Cac012 Out Varchar2,
Po_Aab001 Out Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Count1 Number(2);
v_Count2 Number(2);
v_Count3 Number(2);
v_Aab001 Ac02.Aab001%Type;
v_Aac001 Ac01.Aac001%Type;
v_Cac012 Sac01.Cac012%Type;
Begin
-- 初始化返回值
Po_Fhz := '1';
Select Count(1) Into v_Count1 From Ac01 Where Aac002 = Pi_Aac002;
If v_Count1 <= 0 Then
Po_Msg := '该人员不存在';
Po_Fhz := '-1';
Return;
End If;
Select Aac001 Into v_Aac001 From Ac01 Where Aac002 = Pi_Aac002;
Select Count(1) Into v_Count2 From Sac01 Where Aac001 = v_Aac001;
If v_Count2 <= 0 Then
Po_Msg := '该人员缺少对应的sac01的信息,';
Po_Fhz := '-1';
Return;
End If;
Select a.Cac012 Into v_Cac012 From Sac01 a Where Aac001 = v_Aac001;
Select Count(1)
Into v_Count3
From Ac02
Where Aae140 = '342'
And Aac001 = v_Aac001
And Aac008 = '1';
If v_Count3 <= 0 Then
Po_Msg := '该人员没有正常参保';
Po_Fhz := '-1';
Return;
End If;
Select Distinct (Aab001)
Into v_Aab001
From Ac02
Where Aac001 = v_Aac001
And Aae140 = '342'
And Aac008 = '1';
Po_Aab001 := v_Aab001;
Po_Aac001 := v_Aac001;
Po_Cac012 := v_Cac012;
End;

Procedure Check_Skc84(Pi_Aac001 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Count1 Number(2);
v_Count2 Number(2);
v_Aac001 Ac01.Aac001%Type;
Begin
-- 初始化返回值
Po_Fhz := '1';
Select Count(1)
Into v_Count1
From Skc84
Where Aac001 = Pi_Aac001
And Aae140 = '342';
If v_Count1 <= 0 Then
Po_Msg := '该人员不存在当年的医保缴费';
Po_Fhz := '-1';
Return;
End If;
End;
/*失地农民数据清理导出前,
把导出的数据保存到ic58里,防止再次导出
*/
Procedure Check_Sdnmdcc(Pi_Aab999 In Varchar2,
PI_PCH    in varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Aac001     Ac01.Aac001%Type;
v_Prcname    Varchar2(200);
v_Params     Varchar2(200);
v_Ic58_Count Number(5);
Cursor c_Ydcry Is
Select * From v_Sdnm_Sjql_Dc Where Aab999 = To_Char(Pi_Aab999);
Begin
v_Prcname := 'pkg_weiyl.check_sdnmdc';
v_Params  := 'pi_aab999:' || Pi_Aab999;
Po_Fhz    := '1';
Po_Msg    := '成功';
/*清空ic61*/
For c_Tmp In c_Ydcry Loop
Insert Into Ic58 (Aac001, Aab999) Values (c_Tmp.Aac001, Pi_Aab999);
/*导出用这个表*/
Insert Into Ic61 (Aac001, Aab999) Values (c_Tmp.Aac001, Pi_Aab999);
/*加入批次号 */
insert into ic58_dc
(aac001, aab999, aaz601)
values
(c_Tmp.Aac001, Pi_Aab999, PI_PCH);
End Loop;
Select Count(1) Into v_Ic58_Count From Ic58 Where Aab999 = Pi_Aab999;
If v_Ic58_Count > 0 Then
Po_Fhz := '2';
Po_Msg := '该单位已经进行过导出业务的操作,此次导出将导出该单位下剩余部分的人员,如果之前已经全部导出,那么此次将不导出数据';
End If;
Exception
When Others Then
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Po_Fhz := '-1';
End Check_Sdnmdcc;
/*
现在正在使用的失地农民数据导出
这里使用了动态sql,
注意点:在存储过程里的增删改查语句如果有拼接,
那么一定要用动态sql,否则可能能够编译通过,但是
执行的时候没有达到预期。因为:拼接的where条件很可能被
引擎当作普通字符串处理,也就什么都没查得到,自然更新数据就没法更新成功
*/
Procedure Check_Sdnmdc(Pi_Bae001 In Varchar2,
Pi_Aab999 In Varchar2,
Pi_Pch    In Varchar2,
/* PI_GLT   in varchar2,*/
Pi_Aae001 In Varchar2,
Pi_Aae036 In Varchar2,
Pi_Aac027 In Varchar2,
Pi_Bzw    In Varchar2,
Pi_Oper   In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Aac001     Ac01.Aac001%Type;
v_Prcname    Varchar2(200);
v_Params     Varchar2(200);
v_Ic58_Count Number(5);
v_Tmp        Varchar2(400);
v_Sql        Varchar2(1000);
Cursor c_Ydcry Is
Select *
From v_Sdnm_Sjql_Dc_Multi
Where Aab999 = Func_Check_Para(Pi_Aab999,
Pi_Pch,
Pi_Aae001,
Pi_Aae036,
Pi_Aac027);
Begin

v_Prcname := 'pkg_weiyl.check_sdnmdc';
v_Params  := 'pi_aab999:' || Pi_Aab999;
Po_Fhz    := '1';
Po_Msg    := '成功';
/*拼接where条件*/
Select Func_Check_Para(Pi_Aab999,
Pi_Pch,
Pi_Aae001,
Pi_Aae036,
Pi_Aac027)
Into v_Tmp
From Dual;
/*insert into ic58_dcsj() values (select * from v_sdnm_sjql_dc a where 1=1 and aab999 = '02002489');*/
/*v_Sql := 'Insert Into Ic58_Dcsj
Select a.*, ' || To_Char(Sysdate, 'yyyymmddhh24miss') || ',' ||
Pi_Pch || ',' || '1' || '
From v_Sdnm_Sjql_Dc a
Where a.bae001 = '''||Pi_Bae001||''' and  Aab999 = ' || v_Tmp ||
' And Not Exists (Select *
From Ic58_Dcsj z
Where z.Aaz288 = a.Aaz288
And z.Aac001 = a.Aac001) ';*/
-- 20160505 altered
/* v_Sql := 'Insert Into Ic58_Dcsj
Select a.*, ' || To_Char(Sysdate, 'yyyymmddhh24miss') || ',' ||
Pi_Pch || ',' || '''' || Pi_Bzw || '''' || ',''' || Pi_Oper || '''
From v_Sdnm_Sjql_Dc a
Where  Aab999 = ' || v_Tmp || ' and bae001 = ''' ||
pi_bae001 || ''' And Not Exists (Select *
From Ic58_Dcsj z
Where z.Aaz288 = a.Aaz288
And z.Aac001 = a.Aac001) ';*/
v_Sql := 'Insert Into Ic58_Dcsj
Select a.*, ' || '1,' ||
To_Char(Sysdate, 'yyyymmddhh24miss') || ',' || Pi_Pch || ',' || '''' ||
Pi_Bzw || '''' || ',''' || Pi_Oper || '''
From v_Sdnm_Sjql_Dc a
Where  Aab999 = ' || v_Tmp || ' and bae001 = ''' ||
pi_bae001 || ''' And Not Exists (Select *
From Ic58_Dcsj z
Where z.Aaz288 = a.Aaz288
And z.Aac001 = a.Aac001) ';
Execute Immediate v_Sql;
/*清空ic61*/
/*For c_Tmp In c_Ydcry Loop
Insert Into Ic58 (Aac001, Aab999) Values (c_Tmp.Aac001, Pi_Aab999);
导出用这个表
Insert Into Ic61 (Aac001, Aab999) Values (c_Tmp.Aac001, Pi_Aab999);
加入批次号
Insert Into Ic58_Dc
(Aac001, Aab999, Aaz601, Bzw)
Values
(c_Tmp.Aac001, Pi_Aab999, Pi_Pch, '1');
备份失地农民数据
update ic58_dcsj q set q.dcsj=To_Char(Sysdate, 'yyyymmddhh24miss'),q.aaz601=PI_PCH;
End Loop;*/
/*Select Count(1) Into v_Ic58_Count From Ic58 Where Aab999 = Pi_Aab999;*/
Select Count(1)
Into v_Ic58_Count
From Ic58_Dcsj
Where Aaz601 <> Pi_Pch
And Aab999 = Pi_Aab999;
If v_Ic58_Count > 0 Then
Po_Fhz := '2';
Po_Msg := '该单位已经进行过导出业务的操作,此次导出将导出该单位下剩余部分的人员,如果之前已经全部导出,那么此次将不导出数据';
End If;
Exception
When Others Then
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Po_Fhz := '-1';
End Check_Sdnmdc;

/*失地农民数据清理导出前,
把导出的数据保存到ic58里,防止再次导出
导出单条的check
02002489
*/
Procedure Check_Sdnmdc_Multi(Pi_Bae001 In Varchar2,
Pi_Aab999 In Varchar2,
Pi_Pch    In Varchar2,
/* PI_GLT   in varchar2,*/
Pi_Aae001 In Varchar2,
Pi_Aae036 In Varchar2,
Pi_Aac027 In Varchar2,
Pi_Bzw    In Varchar2,
Pi_Oper   In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_Aac001     Ac01.Aac001%Type;
v_Prcname    Varchar2(200);
v_Params     Varchar2(200);
v_Ic58_Count Number(5);
v_Tmp        Varchar2(400);
v_Sql        Varchar2(1000);
Cursor c_Ydcry Is
Select *
From v_Sdnm_Sjql_Dc
Where Aab999 = Func_Check_Para(Pi_Aab999,
Pi_Pch,
Pi_Aae001,
Pi_Aae036,
Pi_Aac027);
Begin

v_Prcname := 'pkg_weiyl.Check_Sdnmdc_Multi';
v_Params  := 'pi_aab999:' || Pi_Aab999;
Po_Fhz    := '1';
Po_Msg    := '成功';
/*拼接where条件*/
Select Func_Check_Para(Pi_Aab999,
Pi_Pch,
Pi_Aae001,
Pi_Aae036,
Pi_Aac027)
Into v_Tmp
From Dual;
/*insert into ic58_dcsj() values (select * from v_sdnm_sjql_dc a where 1=1 and aab999 = '02002489');*/
/*v_Sql := 'Insert Into Ic58_Dcsj
Select a.*, ' || To_Char(Sysdate, 'yyyymmddhh24miss') || ',' ||
Pi_Pch || ',' || ''''||Pi_Bzw||''''||','''|| Pi_Oper|| '''
From v_Sdnm_Sjql_Dc_multi a
Where  Aab999 = ' || v_Tmp ||
' and bae001 = '''||pi_bae001||''' And Not Exists (Select *
From Ic58_Dcsj z
Where z.Aaz288 = a.Aaz288
And z.Aac001 = a.Aac001) ';*/
v_Sql := 'Insert Into Ic58_Dcsj
Select a.*, ' || To_Char(Sysdate, 'yyyymmddhh24miss') || ',' ||
Pi_Pch || ',' || '''' || Pi_Bzw || '''' || ',''' || Pi_Oper || '''
From v_Sdnm_Sjql_Dc_multi a
Where  Aab999 = ' || v_Tmp || ' and bae001 = ''' ||
pi_bae001 || ''' And Not Exists (Select *
From Ic58_Dcsj z
Where z.Aaz288 = a.Aaz288
And z.Aac001 = a.Aac001) ';
Execute Immediate v_Sql;
/*清空ic61*/
/*For c_Tmp In c_Ydcry Loop
Insert Into Ic58 (Aac001, Aab999) Values (c_Tmp.Aac001, Pi_Aab999);
导出用这个表
Insert Into Ic61 (Aac001, Aab999) Values (c_Tmp.Aac001, Pi_Aab999);
加入批次号
Insert Into Ic58_Dc
(Aac001, Aab999, Aaz601, Bzw)
Values
(c_Tmp.Aac001, Pi_Aab999, Pi_Pch, '1');
备份失地农民数据
update ic58_dcsj q set q.dcsj=To_Char(Sysdate, 'yyyymmddhh24miss'),q.aaz601=PI_PCH;
End Loop;*/
/*Select Count(1) Into v_Ic58_Count From Ic58 Where Aab999 = Pi_Aab999;*/
Select Count(1)
Into v_Ic58_Count
From Ic58_Dcsj
Where Aaz601 <> Pi_Pch
And Aab999 = Pi_Aab999;
If v_Ic58_Count > 0 Then
Po_Fhz := '2';
Po_Msg := '该单位已经进行过导出业务的操作,此次导出将导出该单位下剩余部分的人员,如果之前已经全部导出,那么此次将不导出数据';
End If;
Exception
When Others Then
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Po_Fhz := '-1';
End Check_Sdnmdc_Multi;

Procedure Updatekbb5(Pi_Bae007 In Varchar2,
Pi_Ckz545 In Varchar2,
Pi_Ckb626 In Varchar2,
Pi_Ckb627 In Varchar2,
Pi_Ckb629 In Varchar2,
Pi_Ckb630 In Varchar2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
Begin
Po_Fhz := '1';
Po_Msg := '成功';
Update Kbb5
Set Ckz545 = Pi_Ckz545,
Ckb626 = Pi_Ckb626,
Ckb627 = Pi_Ckb627,
Ckb629 = Pi_Ckb629,
Ckb630 = Pi_Ckb630
Where Bae007 = Pi_Bae007;
End;
Procedure Getaaz601(Pi_Rc     In Varchar2,
po_aaz601 out number,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) Is
v_aaz601 ic58_dc.aaz601%type;
Begin
Po_Fhz := '1';
Po_Msg := '成功';
Select Seq_Ggyw_Aaz601.Nextval into po_aaz601 From Dual;
exception
when others then
po_msg := 'pkg_weiyl.Getaaz601 获取批次号失败';
Po_Fhz := '-1';
End;
/*
知识库相关过程
20160323 by weiyongle
*/
Procedure Insertfw_Zsk(PI_AAA200 in varchar2,
Pi_Aae202 In Varchar2,
Pi_Aaa203 In Varchar2,
Pi_Aae008 In Varchar2,
PI_AAE011 IN VARCHAR2,
PI_AAE906 IN VARCHAR2,
PI_BZ     IN VARCHAR2,
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2) is
begin
po_fhz := '1';
po_msg := '成功';
null;
/*如果是'1',那么说明是修改*/
if pi_bz = '1' then
update fw_zsk
set aae202 = Pi_Aae202,
aaa203 = Pi_Aaa203,
aae008 = pi_aae008,
aae011 = PI_AAE011
where aae906 = PI_AAE906;
elsif pi_bz = '0' then
insert into fw_zsk
(aaa200, aae202, aaa203, aae008, aae011, aae036, aae906)
values
(PI_AAA200,
Pi_Aae202,
Pi_Aaa203,
pi_aae008,
PI_AAE011,
To_Char(Sysdate, 'yyyymmddhh24miss'),
SEQ_FW_AAE906.Nextval);
end if;
exception
when others then
po_fhz := '-1';
po_msg := '失败';
end Insertfw_Zsk;
/*拼接两个字符串,
练手嵌套存储过程
注意点:使用嵌套存储过程时,在declaration中可以同时定义变量
但是 定义的变量只能够写在嵌套存储过程的前面,否则没法编译通过
20160407
*/
procedure testNestedPro(pi_xing   in varchar2,
pi_ming   in varchar2,
pi_aab001 in number,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_name     varchar2(200);
v_ac01_row ac01%rowtype;
v_fhz      varchar2(200);
v_msg      varchar2(200);
v_procName varchar2(200);
v_params   varchar2(400);
procedure print_name(pi_para1 in varchar2,
pi_para2 in varchar2,
po_name  out varchar2) is
begin
po_name := pi_para1 || pi_para2;
exception
when others then
po_name := '没有成功拼接两个入参';
end print_name;

procedure getAc01(pi_aab001 in number,
po_ac01   out ac01%rowtype,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_procName varchar2(200);
v_params   varchar2(400);
v_sqlcode  varchar2(500);
v_sqlerrm  varchar2(500);
begin
--初始化
v_procName := 'pkg_weiyl.getAc01';
v_params   := 'pi_aab001=' || pi_aab001;
-- 这里是因为模拟 rowtype数据类型的情况,所以条件中加了 rownum=1 ,以确保select into 的时候只有一条数据 ,
select a.*
into po_ac01
from ac01 a
where a.aab001 = pi_aab001
and rownum = 1;
exception
when others then
v_sqlcode := sqlcode;
v_sqlerrm := sqlerrm;
po_fhz    := v_procName || '_001';
/* PKG_FUN.F_ERRMSG(V_PROCNAME, SQLCODE, SQLERRM, V_PARAMS);*/
po_msg := pkg_fun.F_ERRMSG(v_procName, sqlcode, sqlerrm, v_params);
pkg_weiyltools.get_e_msg(sqlerrm,
'po_ac01',
'AAB001',
pi_aab001,
' where 条件',
po_fhz,
po_msg);
return;
end getAc01;

begin
--初始化 返回值

po_fhz := '-1';
po_msg := '失败';
--初始化
v_procName := 'pkg_weiyl.testNestedPro';
v_params   := 'pi_aab001=' || pi_aab001;
print_name(pi_xing, pi_ming, v_name);
if (length(v_name) > 100) then
po_msg := '拼接的字符串太长!';
else
po_msg := '成功拼接,拼接好的字符串为:' || v_name;
end if;
begin
/*select aac002 into v_test from ac01 where aac001 = 1234;*/
-- 20160801 注释
/*update ac01
set aac001 = 1000035129
where aac002 = '511011198604126824';*/
begin
getAc01(pi_aab001, v_ac01_row, v_fhz, v_msg);
if v_fhz != '1' then
po_fhz := po_fhz || v_fhz;
po_msg := po_msg || v_msg;
return;
else
insert into ac01_temp
values
(v_ac01_row.BAE001,
v_ac01_row.AAB001,
v_ac01_row.AAC001,
v_ac01_row.CAC002,
v_ac01_row.AAC058,
v_ac01_row.AAC002,
v_ac01_row.AAC003,
v_ac01_row.AAC004,
v_ac01_row.AAC006,
v_ac01_row.AAC007,
v_ac01_row.CAC089,
v_ac01_row.CAC090,
v_ac01_row.AAC027,
v_ac01_row.CAC005,
v_ac01_row.AAC009,
v_ac01_row.AAC013,
v_ac01_row.AAE473,
v_ac01_row.AAC020,
v_ac01_row.CAC007,
v_ac01_row.CAC008,
v_ac01_row.CAC009,
v_ac01_row.AAE200,
v_ac01_row.CAC010,
v_ac01_row.CAC011,
v_ac01_row.CAC012,
v_ac01_row.AAZ099,
v_ac01_row.CAC121,
v_ac01_row.CAE383,
v_ac01_row.CAC161,
v_ac01_row.AAE341,
v_ac01_row.CAC201,
v_ac01_row.CAC202,
v_ac01_row.AAC015,
v_ac01_row.AAC016,
v_ac01_row.AAE013,
v_ac01_row.CIE500,
v_ac01_row.CIE501,
v_ac01_row.AAC109,
v_ac01_row.CIE503,
v_ac01_row.CAC542,
v_ac01_row.CAC546,
v_ac01_row.CAC547,
v_ac01_row.CAC549,
v_ac01_row.AAB401,
v_ac01_row.CKC695,
v_ac01_row.CKE814,
v_ac01_row.CAC560,
v_ac01_row.CAC563,
v_ac01_row.CAC564,
v_ac01_row.JB_AAE200,
v_ac01_row.CAC561_DISUSE);
end if;
exception
when others then
po_fhz := v_procName || '_02';
po_msg := pkg_fun.F_ERRMSG(v_procName, sqlcode, sqlerrm, v_params);
return;
end;
exception
when others then
pkg_weiyltools.get_e_msg(sqlerrm,
'AC01',
'aac001',
'1000035129',
' where aac002 = 511011198604126824',
po_fhz,
po_msg);
return;
end;

exception
when others then
po_fhz := '-1';
po_msg := '失败';
end testNestedPro;
/*触摸屏查询标记*/
procedure cancelCmp(PI_SERIALNUM in varchar2,
po_fhz       out varchar2,
po_msg       out varchar2) is
v_Prc     varchar2(40);
v_Prcname varchar2(50);
v_Params  varchar2(400);
v_Sqlerrm varchar2(100);
begin
--初始化
-- 初始化返回值
Po_Fhz    := '1';
Po_Msg    := '';
v_Prc     := '.updateIDCard';
v_Prcname := c_Pkg_Name || v_Prc;
v_Params  := ',传入参数为:PI_SERIALNUM=' || PI_SERIALNUM;
update printserialnum
set bce326 = '1'
where SERIALNUM = PI_SERIALNUM
and bce326 <> '1';
exception
when others then
v_Sqlerrm := Substr(Sqlerrm, 1, 9);
/* 捕获,无效数字*/
If v_Sqlerrm = 'ORA-01722' Then
Po_Fhz := v_Prcname || '_3';
Po_Msg := '数据库报错,提示无效数字,可能的原因是:入参:' || PI_SERIALNUM ||
'可能是数值型,应该为字符串类型';
return;
else
po_fhz := v_Prcname || '_1';
po_msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
return;
end if;
end cancelCmp;

/*取消征集通知单*/
procedure cancelAaz288(PI_OPERID in varchar2,
PI_AAZ288 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_cnt_ab07 number(3);
v_cnt_ad21 number(2);
v_cnt_ac43 number(4);
v_Prc      varchar2(400);
v_aae111   ad21.aae111%type;
begin
-- 初始化返回值
Po_Fhz := '1';
Po_Msg := '成功';
v_Prc  := '.cancelAaz288';
/*校验*/
select distinct (aae111)
into v_aae111
from V_BXGX_JJGL_ZZZJ_DWZSJHMX
where aaz288 = PI_AAZ288;
if v_aae111 <> '0' then
Po_Fhz := '-11';
Po_Msg := '征收计划的到账标识不为【未到账】';
return;
end if;
/*更新ab07*/
select count(1) into v_cnt_ab07 from ab07 where aaz288 = PI_AAZ288;
if v_cnt_ab07 > 0 then
update ab07 set aaz288 = null where aaz288 = PI_AAZ288;
end if;
/*更新ad21*/
select count(1) into v_cnt_ad21 from ad21 where aaz288 = PI_AAZ288;
if v_cnt_ad21 > 0 then
update ad21
set cae033 = 2,
cae030 = PI_OPERID,
cae031 = to_char(sysdate, 'yyyymmddhh24miss')
where aaz288 = PI_AAZ288;
end if;
/*更新ab43*/
select count(1) into v_cnt_ac43 from ac43 where aaz288 = PI_AAZ288;
if v_cnt_ac43 > 0 then
update ac43 set aaz288 = '' where aaz288 = PI_AAZ288;
end if;
exception
when others then
-- Sqlcode, Sqlerrm
Po_Fhz := '-1';
Po_Msg := '过程' || Pkg_Name || v_Prc || '报错,ac01表里没有找到该人员';
end cancelAaz288;
/*删除知识库核销的附件内容,否则数据里的不必要的附件会越来越多*/
procedure deleteZskFile(PI_CAE232 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) IS
v_cae232_cnt number(4);
v_Prc        varchar2(100);
v_Prcname    varchar2(100);
v_Params     varchar2(400);
begin
--初始化
Po_Fhz    := '1';
Po_Msg    := '成功';
v_Prc     := '.updateIDCard';
v_Prcname := c_Pkg_Name || v_Prc;
v_Params  := ',传入参数为:PI_CAE232=' || PI_CAE232;
select count(1)
into v_cae232_cnt
from wyl_file a
where a.cae232 = PI_CAE232;
if v_cae232_cnt > 0 then
delete from wyl_file where cae232 = PI_CAE232;
end if;
--异常
exception
when others then
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);
Po_Fhz := '-1';
end deleteZskFile;
/*
生成项目明细统计报表数据
*/
procedure generatexmmx(pi_ksrq in varchar2,
pi_zzrq in varchar2,
po_fhz  out varchar2,
po_msg  out varchar2) is
v_count  number(3);
v_tongji fw_xmmx%rowtype;
cursor cur_fw_xmmx is
select *
from fw_xmmx
where aae008 >= pi_ksrq
and aae008 <= pi_zzrq;
cursor cur_jhnywc is
--计划内完成验证的
select a.bae010, count(1) num1
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '01'
and a.aae026 = '1'
and cae011 = '04'
group by a.bae010;

cursor cur_jhwywc is
--计划外完成验证的
select a.bae010, count(1) num1
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '02'
and a.aae026 = '1'
and cae011 = '04'
group by a.bae010;

cursor cur_jhnwwc is
--计划内未完成验证的  3
select a.bae010, count(1) num2
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '01'
and a.aae026 is null
and cae011 <> '04'
and cae011 <> '05'
group by a.bae010;

cursor cur_jhwwwc is
--计划外未完成验证的
select a.bae010, count(1) num2
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '02'
and a.aae026 is null
and cae011 <> '04'
and cae011 <> '05'
group by a.bae010;

cursor cur_jhnywc_gs is
--计划内完成工时  4
select a.bae010, sum(a.aae018) jhgs, sum(a.aae019) sjgs
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '01'
and a.aae026 = '1'
and cae011 = '04'
group by a.bae010;

cursor cur_jhwywc_gs is
--计划外完成工时
select a.bae010, sum(a.aae018) jhgs, sum(a.aae019) sjgs
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '02'
and a.aae026 = '1'
and cae011 = '04'
group by a.bae010;

cursor cur_jhnwwc_gs is
--计划内未完成工时
select a.bae010, sum(a.aae018) jhgs, sum(a.aae019) sjgs
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '01'
and a.aae026 is null
and cae011 <> '04'
and cae011 <> '05'
group by a.bae010;

cursor cur_jhwwwc_gs is
--计划外未完成工时
select a.bae010, sum(a.aae018) jhgs, sum(a.aae019) sjgs
from fw_xmmx a
where a.aae008 >= pi_ksrq
and a.aae008 <= pi_zzrq
and a.aae022 = '02'
and a.aae026 is null
and cae011 <> '04'
and cae011 <> '05'
group by a.bae010;

begin
po_fhz := '1';
po_msg := '成功';
delete from fw_xmmx_tongji;
insert into fw_xmmx_tongji
(bae010)
select AAA102 from aa10 where aaa100 = 'BAE010';
/*循环插入计划内 已经 完成验证的*/
for v_cur in cur_jhnywc loop
update fw_xmmx_tongji
set jhn_ywc = v_cur.num1, ksrq = pi_ksrq, zzrq = pi_zzrq
where bae010 = v_cur.bae010;
null;
end loop;

/*循环插入计划外 已经 完成验证的*/
for v_cur_ in cur_jhwywc loop
update fw_xmmx_tongji
set jhw_ywc = v_cur_.num1, ksrq = pi_ksrq, zzrq = pi_zzrq
where bae010 = v_cur_.bae010;
null;
end loop;

/*循环更新计划内 未 完成验证的*/
for v_cur2 in cur_jhnwwc loop
update fw_xmmx_tongji k
set jhn_wwc = v_cur2.num2
where k.bae010 = v_cur2.bae010;
null;
end loop;

/*循环更新计划外 未 完成验证的*/
for v_cur2_ in cur_jhwwwc loop
update fw_xmmx_tongji k
set jhw_wwc = v_cur2_.num2
where k.bae010 = v_cur2_.bae010;
null;
end loop;

/*计划内完成工时  3 */
for v_cur3 in cur_jhnywc_gs loop
/*update fw_xmmx_tongji k set jhn_ywcgs= v_cur3.jhgs,jhn_ where k.bae010 = v_cur2.bae010;*/
update fw_xmmx_tongji k
set jhn_ywcgs = v_cur3.jhgs, jhn_ywcgs_sj = v_cur3.sjgs
where k.bae010 = v_cur3.bae010;
null;
end loop;

/*计划外完成工时  3 */
for v_cur3_ in cur_jhwywc_gs loop
/*update fw_xmmx_tongji k set jhn_ywcgs= v_cur3.jhgs,jhn_ where k.bae010 = v_cur2.bae010;*/
update fw_xmmx_tongji k
set jhw_ywcgs = v_cur3_.jhgs, jhw_ywcgs_sj = v_cur3_.sjgs
where k.bae010 = v_cur3_.bae010;
null;
end loop;

/*计划内未完成工时  4*/
for v_cur4 in cur_jhnwwc_gs loop
update fw_xmmx_tongji k
set jhn_ywcgs = v_cur4.jhgs, jhn_ywcgs_sj = v_cur4.sjgs
where k.bae010 = v_cur4.bae010;
null;
end loop;

/*计划外未完成工时  4*/
for v_cur4_ in cur_jhwwwc_gs loop
update fw_xmmx_tongji k
set jhw_ywcgs = v_cur4_.jhgs, jhw_ywcgs_sj = v_cur4_.sjgs
where k.bae010 = v_cur4_.bae010;
null;
end loop;

null;
end;
/*
修正sic86 的单位编号,以sic84.aab001为依据, 用于pkg_zhgl.Ylgrzh_Cxtj,以弥补重新统计过程的缺陷
add by weiyongle 20160506
*/
procedure rebuild_sic86(pi_aac001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_cae121    sic84.aae002%type;
v_cnt_sic86 number(2);
v_cnt_ac20  number(2);
v_aab001    sic86.aab001%type;
v_aae041    ac20.aae041%type;
v_ksny      sic86.aae001%type;
v_zzny      sic86.aae001%type;
cursor c_aae002_sic84 is
select max(cae121) cae121, aab001
from sic84
where aac001 = pi_aac001
group by substr(aae002, 1, 4), aab001
order by cae121;
begin
--初始化参数
po_fhz := '-1';
po_msg := '成功';
for v_cur in c_aae002_sic84 loop
v_cae121 := v_cur.cae121;
select count(1)
into v_cnt_sic86
from sic86
where aac001 = pi_aac001
and aae001 = substr(v_cae121, 1, 4);
begin
if v_cnt_sic86 != 1 then
po_fhz := '-1';
po_msg := '该人员' || pi_aac001 || '在 ' || substr(v_cae121, 1, 4) ||
'年度有多条个人养老账户,请核查!';
return;
end if;
/*update sic86
set aab001 = v_cur.aab001
where aac001 = pi_aac001
and aae001 = substr(v_aae002, 1, 4);*/
update sic86
set aab001 =
(select aab001
from sic84
where aac001 = pi_aac001
/* 必须按照cae121来 判断,而不能用 aae002来判断 ,否则有些情况会出问题 */
and cae121 = v_cur.cae121)
where aac001 = pi_aac001
and aae001 = substr(v_cae121, 1, 4);
exception
when others then
po_fhz := '-2';
po_msg := '更新人员' || pi_aac001 || ',' || substr(v_cae121, 1, 4) ||
'年度的养老账户时发生系统错误!';
return;
end;
end loop;
/*select min(substr(aae041,1,4)) from ac20 where aac001 = 1000194637;-- ksny
select min(substr(cae121,1,4))-1 from sic84 where aac001 = 1000194637; -- zzny */
-- add by weiyongle 20160527
begin
select min(substr(aae041, 1, 4))
into v_ksny
from ac20
where aac001 = pi_aac001;
select min(substr(cae121, 1, 4))
into v_zzny
from sic84
where aac001 = pi_aac001;
/*
如果ac20的最小年份小于sic84的最小年份,
那么从ac20的最小年份到sic84最小年份的上一年开始循环
*/
if v_ksny < v_zzny then
v_zzny := v_zzny - 1;
for i in v_ksny .. v_zzny loop
begin
select max(aae041)
into v_aae041
from ac20
where aac001 = pi_aac001
and substr(aae041, 1, 4) = i;
select count(1)
into v_cnt_ac20
from ac20
where aac001 = pi_aac001
and aae041 = v_aae041;
/*如果最小年份有多条开始月份相同的的ac20记录,那么报错*/
if v_cnt_ac20 > 1 then
po_fhz := '-2';
po_msg := '改人员的养老历史账户在' || i || '年度有多条以' || v_aae041 ||
'作为开始年月的记录,不符合常理,请先到历史维护模块进行数据修正';
return;
else
select aab001
into v_aab001
from ac20 b
where aac001 = pi_aac001
and b.aae041 = v_aae041;
end if;
end;

/*update sic86
set aab001 =
(select aab001
from ac20 b
where aac001 = pi_aac001 and substr(b.aae041, 1, 4) = v_ksny)
where aac001 = pi_aac001
and aae001 = i;*/
update sic86
set aab001 = v_aab001
where aac001 = pi_aac001
and aae001 = i;
end loop;
end if;
end;

end rebuild_sic86;

procedure rebuild_ab07(pi_aab001 in varchar2,
pi_ksny   in varchar2,
pi_zzny   in varchar2,
pi_aae140 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is

cursor c_ac43 is
select *
from ac43
where aab001 = pi_aab001
and aaz288 is null;
begin

/*for i in ksny .. zzny loop
null;
pkg_yuejie.dwzjjh_cxtj_aae140(pi_aab001,
pi_aae002 => :pi_aae002,
pi_aae140 => :pi_aae140,
po_fhz => :po_fhz,
po_msg => :po_msg);
end loop;*/
--初始化参数
po_fhz := '1';
po_msg := '成功';
/*for v_cur in c_ac43 loop
pkg_yuejie.dwzjjh_cxtj_aae140(pi_aab001,
v_cur.aae002,
'110',
po_fhz,
po_msg);
end loop;*/

for i in pi_ksny .. pi_zzny loop
pkg_yuejie.dwzjjh_cxtj_aae140(pi_aab001,
i,
pi_aae140,
po_fhz,
po_msg);
end loop;

exception
when others then
po_fhz := '-1';
po_msg := '失败';
return;
end rebuild_ab07;

/*Pkg_Ryhb_Pl_New
--批量合并,初始数据生成
Procedure Plhb_Start(Pi_Bae001 In Varchar2,
Pi_Aab001 In Number,
Pi_Jbr    In Varchar2, --- 10000641
Po_Fhz    Out Varchar2,
Po_Msg    Out Varchar2)
*/
procedure generate_plhb_data(pi_bae001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is
cursor cur_dwxx is
select * from ae01 where bae001 = pi_bae001;
begin
-- 初始化
po_msg := '成功';
po_fhz := '1';
for v_cur in cur_dwxx loop
Pkg_Ryhb_Pl_New.Plhb_Start(pi_bae001,
v_cur.aab001,
'10000641',
po_fhz,
po_msg);
end loop;
exception
when others then
po_msg := '失败';
po_fhz := '-1';
end;
/*查询知识库数据*/
procedure queryZSK(PI_AAE906 in varchar2,
PO_AAE202 out varchar2,
PO_AAE008 out varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_cnt number(2);
cursor c_zsk is
select * from fw_zsk where aae906 = pi_aae906;
begin
-- 初始化参数
po_fhz := '1';
po_msg := '获取数据成功!';
select count(1) into v_cnt from fw_zsk where aae906 = pi_aae906;
if v_cnt = 1 then
for v_zsk in c_zsk loop
po_aae202 := v_zsk.aae202;
po_aae008 := v_zsk.aae008;
end loop;
else
po_fhz := '-1';
po_msg := '_9,返回值过多';
end if;
end queryZSK;
/*
生成失地农民汇总数据
by weiyongel 20160519
*/
procedure generate_sdnmhzsj(PI_BAE001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_aab383 ic51.aab383%type;
v_aic452 ic51.aic452%type;
v_aic453 ic51.aic453%type;
v_rs     ic5152_hzb.rs%type;
v_cnt    number(2);
cursor c_Ic5152_Temp is
select *
from Ic5152_Temp
where bae001 = pi_bae001
and imp_flag = '1'
and zfbtfs <> null;
begin
-- 初始化参数
po_fhz := '1';
po_msg := '数据汇总成功!';
/*for v_c_Ic5152_Temp in c_Ic5152_Temp loop

null;
end loop;*/
begin
select count(1) into v_cnt from ic5152_hzb where bae001 = pi_bae001;
/*如果大于0,那么就先清除这个汇总表*/
if v_cnt > 0 then
delete from ic5152_hzb where bae001 = pi_bae001;
end if;
end;
select sum(nvl(aab383, 0))
into v_aab383
from Ic5152_Temp
where bae001 = pi_bae001
and imp_flag = '1'
and zfbtfs is not null;
select count(distinct(aac002))
into v_rs
from Ic5152_Temp
where bae001 = pi_bae001
and imp_flag = '1'
and zfbtfs is not null;
select sum(nvl(aic452, 0))
into v_aic452
from Ic5152_Temp
where bae001 = pi_bae001
and imp_flag = '1'
and zfbtfs is not null;
select sum(nvl(aic453, 0))
into v_aic453
from Ic5152_Temp
where bae001 = pi_bae001
and imp_flag = '1'
and zfbtfs is not null;
insert into ic5152_hzb
(bae001, rs, aab383, aic452, aic453)
values
(PI_BAE001, v_rs, v_aab383, v_aic452, v_aic453);
-- 调用生成清理数据的过程
generate_sdnmqlsj(PI_BAE001, po_fhz, po_msg);
exception
when others then
po_fhz := '-1';
po_msg := 'pkg_weiyl.generate_sdnmhzsj 数据汇总失败!';
return;
end generate_sdnmhzsj;

/*
生成失地农民清理数据
by weiyongel 20160519
*/
procedure generate_sdnmqlsj(PI_BAE001 in varchar2,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_aab383 ic51.aab383%type;
v_aic452 ic51.aic452%type;
v_aic453 ic51.aic453%type;
v_rs     ic5152_qlb .rs%type;
v_cnt    number(2);
cursor c_Ic5152_Temp is
select sum(nvl(a.aab383, 0)) aab383,
sum(nvl(a.aic453, 0)) aic453,
sum(nvl(a.aic452, 0)) aic452,
count(distinct(a.aac002)) rs,
a.aae001 aae001
from Ic5152_Temp a
where bae001 = PI_BAE001
and imp_flag = '1'
and zfbtfs is not null
group by aae001;
begin
-- 初始化参数
po_fhz := '1';
po_msg := '生成失地农民清理数据成功!';
begin
select count(1) into v_cnt from ic5152_qlb where bae001 = pi_bae001;
/*如果大于0,那么就先删除这个汇总表*/
if v_cnt > 0 then
delete from ic5152_qlb where bae001 = pi_bae001;
end if;
end;
for v_c_Ic5152_Temp in c_Ic5152_Temp loop
/*插入清理数据表 ,用于报表数据提取 */
insert into ic5152_qlb
(bae001, aae001, rs, aab383, aic452, aic453)
values
(PI_BAE001,
v_c_Ic5152_Temp.aae001,
v_c_Ic5152_Temp.rs,
v_c_Ic5152_Temp.Aab383,
v_c_Ic5152_Temp.Aic452,
v_c_Ic5152_Temp.Aic453);
null;
end loop;

exception
when others then
po_fhz := '-1';
po_msg := 'pkg_weiyl.generate_sdnmhzsj 数据汇总失败!';
return;
end generate_sdnmqlsj;

/*生成失地农民数据清理后的变化字段,用于查询失地农民数据清理模块*/
procedure generate_sdnmdatachange(PI_AAC001 in varchar2,
PI_AAZ288 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) is
cursor c_ic51_bf is
select *
from ic51_bf
where aac001 = pi_aac001
and aaz288 = pi_aaz288;
cursor c_ic51 is
select *
from ic51
where aac001 = pi_aac001
and aaz288 = pi_aaz288;
v_cnt_bf     number(2);
v_aic443_tmp ic51_bf.aic443%type;
begin
/*--正常或暂停参保并且是老系统导入的可以修改个人缴费金额
Update Ic51
Set Aic443 = v_Ic5152_Temp.Aic443,
Aic444 = v_Ic5152_Temp.Aic444,
Aic020 = v_Ic5152_Temp.Aic020,
Aab383 = v_Ic5152_Temp.Aab383,
Aic446 = v_Ic5152_Temp.Aic446,
Aic452 = v_Ic5152_Temp.Aic452,
Aic448 = v_Ic5152_Temp.Aic448,
Aic453 = v_Ic5152_Temp.Aic453,
Aic021 = v_Ic5152_Temp.Aic021,
Aaa041 = v_Ic5152_Temp.Aaa041,
Aae002 = v_Ic5152_Temp.Aae002
Where Aac001 = v_Aac001
And Aaz288 = v_Ic5152_Temp.Aaz288
And Bce094 = '1'
And Aae016 = '1';*/
-- 初始化参数
po_fhz := '1';
po_msg := '生成变更记录数据成功!';
-- 1. 先做判断,如果已经生成了相应的变更记录,那么就先删除相应的变更记录表,然后重新生成最新的数据
begin
select count(1)
into v_cnt_bf
from ic5152_bg
where aac001 = pi_aac001
and aaz288 = pi_aaz288;
if v_cnt_bf > 0 then
delete from ic5152_bg
where aaz288 = pi_aaz288
and aac001 = pi_aac001;
end if;
end;
-- 2. 生成最新的变更记录表
for v_bf in c_ic51_bf loop
begin
-- 1 先插入aaz288,aac001,aae001,aae002等信息
insert into ic5152_bg
(aaz288, bae001, aac001, aae002, aae001)
values
(PI_AAZ288, v_bf.bae001, v_bf.aac001, v_bf.aae002, v_bf.aae001);
for v_ic51 in c_ic51 loop
-- a. 先直接更新变更记录表
update ic5152_bg a
set a.aic020  = v_ic51.aic020,
a.aic020_ = v_bf.aic020,
a.aic443  = v_ic51.aic443,
a.aic443_ = v_bf.aic443,
a.aic444  = v_ic51.aic444,
a.aic444_ = v_bf.aic444,
a.aab383  = v_ic51.aab383,
a.aab383_ = v_bf.aab383,
a.aic446  = v_ic51.aic446,
a.aic446_ = v_bf.aic446,
a.aic452  = v_ic51.aic452,
a.aic452_ = v_bf.aic452,
a.aic448  = v_ic51.aic448,
a.aic448_ = v_bf.aic448,
a.aic453  = v_ic51.aic453,
a.aic453_ = v_bf.aic453,
a.aic021  = v_ic51.aic021,
a.aic021_ = v_bf.aic021,
a.aaa041  = v_ic51.aaa041,
a.aaa041_ = v_bf.aaa041
where aaz288 = pi_aaz288;

if v_ic51.aic443 != v_bf.aic443 then
update ic5152_bg
set aic443 = v_ic51.aic443, aic443_ = v_bf.aic443
where aaz288 = pi_aaz288;
end if;

if v_ic51.aic444 != v_bf.aic444 then
update ic5152_bg
set aic444 = v_ic51.aic444, aic444_ = v_bf.aic444
where aaz288 = pi_aaz288;
end if;

if v_ic51.aab383 != v_bf.aab383 then
update ic5152_bg
set aab383 = v_ic51.aab383, aab383_ = v_bf.aab383
where aaz288 = pi_aaz288;
end if;

/*if v_ic51.aic443 != v_bf.aic443 then
update ic5152_bg aic443,aic443_ set v_ic51.aic433,v_bf.aic443;
end if;

if v_ic51.aic443 != v_bf.aic443 then
update ic5152_bg aic443,aic443_ set v_ic51.aic433,v_bf.aic443;
end if;

if v_ic51.aic443 != v_bf.aic443 then
update ic5152_bg aic443,aic443_ set v_ic51.aic433,v_bf.aic443;
end if;*/
end loop;
exception
when others then
po_fhz := '-11';
po_msg := '生成变更记录数据失败!';
end;
end loop;
exception
when others then
po_fhz := '-1';
po_msg := '生成变更记录数据失败!';
end generate_sdnmdatachange;
/*检查ac35时间 ,增减员时用*/
procedure checkAC35Tim(PI_AAC002 in varchar2,
pi_aab999 in varchar2,
Po_AAE042 OUT varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) is
v_cnt    number(3);
v_cnt2   number(12);
v_cnt3   number(12);
v_aac001 ac01.aac001%type;
v_aae042 ac35.aae042%type;
n_aab001 ae01.aab001%type;
begin
--初始化
-- 初始化参数
po_fhz := '1';
po_msg := 'success';
select count(1) into v_cnt from ac01 where aac002 = pi_aac002;

if v_cnt > 0 then

select aab001 into n_aab001 from ae01 where aab999 = pi_aab999;

select nvl(max(aae042), '111111')
into Po_AAE042
from ac35
where aac001 in (select aac001 from ac01 where aac002 = pi_aac002)
and aab001 = n_aab001;

else
Po_AAE042 := '111111';
end if;
exception
when others then
po_fhz := '-1';
po_msg := '获取ac35.aae042出错,success';
end checkAC35Tim;

/* 重新统计ac43 aae002 ,20160526 */
procedure cxtj_ac43(PI_AAB001 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) is
v_cnt    number(5);
v_cae122 ac43.cae122%type;
v_aae002 ac43.aae002%type;
cursor c_ac43 is
select *
from ac43
where aab001 = pi_aab001
and aaz288 is null;
begin
--初始化
-- 初始化参数
po_fhz := '1';
po_msg := 'success';
begin
select count(1)
into v_cnt
from ac43
where aab001 = pi_aab001
and aaz288 is null;
if v_cnt > 0 then
for v_cur_ac43 in c_ac43 loop
/*if v_cur_ac43.aae002 != v_cur_ac43.cae122 then
update ac43
set aae002 = v_cur_ac43.cae122
where aab001 = pi_aab001
and aaz288  is null
and cae122 = v_cur_ac43.cae122;
end if;*/
update ac43
set aae002 = v_cur_ac43.cae122
where aab001 = pi_aab001
and aaz288 is null
and cae122 = v_cur_ac43.cae122;
end loop;
end if;
end;
end cxtj_ac43;

procedure getAAC027(PI_AAC002 in varchar2,
PO_AAC027 OUT varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) IS
v_cnt    number(1);
v_aac027 ac01.aac027%type;
begin
--初始化
-- 初始化参数
po_fhz := '1';
po_msg := 'success';
select count(1) into v_cnt from ac01 where aac002 = pi_aac002;
if v_cnt > 0 then
select aac027 into v_aac027 from ac01 where aac002 = pi_aac002;
PO_AAC027 := v_aac027;
end if;
exception
when others then
po_fhz := '-1';
po_msg := 'error';
end getAAC027;

/* for test ,20160530 */
procedure myInsert(PI_AAC002 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) is
begin
--初始化
-- 初始化参数
po_fhz := '1';
po_msg := 'success';
insert into xzl_one (aac002) values (pi_aac002);
exception
when others then
po_fhz := '-1';
po_msg := 'error';
end myInsert;
/*统计 社会保险参保情况查询 */
procedure tongji_shbx_old(PI_AAC001 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) is
v_cnt          number(2);
v_cic818       T_BXGX_SHBXCBQKCXJG_WYL.Cic818%type;
v_cic819       T_BXGX_SHBXCBQKCXJG_WYL.Cic819%type;
v_aae042_ac20  ac20.aae042%type;
v_aae041_ac20  ac20.aae041%type;
v_aae041_sac14 sac14.aae041%type;
v_aae042_sac14 sac14.aae042%type;
v_yf           number(2);
v_Prc          Varchar2(20);
v_Prcname      Varchar2(200);
v_Params       Varchar2(500);
cursor cur_t is
select count(1) cnt, aae001
from T_BXGX_SHBXCBQKCXJG_WYL
where aac001 = pi_aac001
group by aae001
order by aae001;
begin
-- 初始化返回值
Po_Fhz    := '1';
Po_Msg    := '';
v_Prc     := '.tongji_shbx';
v_Prcname := c_Pkg_Name || v_Prc;
v_Params  := ',传入参数为:pi_aac001=' || Pi_Aac001;
-- 自建表 T_BXGX_SHBXCBQKCXJG_WYL  1000745288
/*
从这里取值,可以直接复制到  表 T_BXGX_SHBXCBQKCXJG_WYL 中
select bae001,
aae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
cic818,
sum(cic819) cic819,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz
from v_bxgx_shbxcbqkcxjg_xgy_
where aac001 = 1000745288
group by bae001,
aae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
cic818,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz order by aae001;*/
-- 清空临时表
delete from T_BXGX_SHBXCBQKCXJG_WYL where aac001 = pi_aac001;
delete from T_BXGX_SHBXCBQKCXJG_WYL_ where aac001 = pi_aac001;
/*插入数据*/

insert into T_BXGX_SHBXCBQKCXJG_WYL
select bae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
aae001,
cic818,
sum(nvl(cic819, 0)) cic819,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz
from v_bxgx_shbxcbqkcxjg_xgy_
where aac001 = pi_aac001
group by bae001,
aae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
cic818,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz
order by aae001;
insert into T_BXGX_SHBXCBQKCXJG_WYL_
select * from T_BXGX_SHBXCBQKCXJG_WYL where aac001 = pi_aac001;
-- 判断是否有多条,有多条就算是有转入的
-- select count(1),aae001 into v_cnt from T_BXGX_SHBXCBQKCXJG_WYL where aac001 = pi_aac001 group by aae001 order by aae001;
for v_cur in cur_t loop

if v_cur.cnt > 1 then
select sum(nvl(cic818, 0)) cic818_hj
into v_cic818
from T_BXGX_SHBXCBQKCXJG_WYL
where aae001 = v_cur.aae001;

select sum(nvl(cic819, 0)) cic819_hj
into v_cic819
from T_BXGX_SHBXCBQKCXJG_WYL
where aae001 = v_cur.aae001;

update T_BXGX_SHBXCBQKCXJG_WYL_ a
set a.cic818 = v_cic818
where aac001 = pi_aac001
and aae001 = v_cur.aae001;
-- 因为有两条,一条为转入,一条为本地,所以要 删除一条,然后更新
delete from T_BXGX_SHBXCBQKCXJG_WYL_
where aac001 = pi_aac001
and aae001 = v_cur.aae001
and aae087 = '1';
update T_BXGX_SHBXCBQKCXJG_WYL_ a
set a.cic819 = v_cic819
where aac001 = pi_aac001
and aae001 = v_cur.aae001;
end if;
-- 修正 转入的月份
select aae042
into v_aae042_ac20
from ac20
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;
select aae041
into v_aae041_ac20
from ac20
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;

select aae042
into v_aae042_sac14
from sac14
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;
select aae041
into v_aae041_sac14
from sac14
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;

if v_aae042_ac20 <= v_aae041_sac14 or v_aae042_sac14 <= v_aae041_ac20 then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 + v_aae042_sac14 -
v_aae041_sac14 + 1;
-- 有重合的情况
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 < v_aae042_sac14 and
v_aae041_ac20 <= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 + v_aae042_sac14 -
v_aae041_sac14 + 1 - (v_aae042_ac20 - v_aae041_sac14 + 1);
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 < v_aae042_sac14 and
v_aae041_ac20 >= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 + v_aae042_sac14 -
v_aae041_sac14 + 1 - (v_aae042_ac20 - v_aae041_ac20 + 1);
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 < v_aae042_sac14 and
v_aae041_ac20 >= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 + v_aae042_sac14 -
v_aae041_sac14 + 1 - (v_aae042_ac20 - v_aae041_ac20 + 1);
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 >= v_aae042_sac14 and
v_aae041_ac20 <= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1;

Elsif v_aae042_ac20 >= v_aae042_sac14 and
v_aae041_ac20 > v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 +
(v_aae042_sac14 - v_aae041_sac14 + 1) -
(v_aae041_ac20 - v_aae041_sac14 + 1);
end if;
update T_BXGX_SHBXCBQKCXJG_WYL_ a
set a.cic818 = v_yf
where aac001 = pi_aac001
and aae001 = v_cur.aae001;
end loop;

exception
when others then
Po_Fhz := v_Prcname || '_91,重新统计月份出错';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);

end tongji_shbx_old;

/*
20160801 修改
统计 社会保险参保情况查询 ,对应于 眉山市的养老对账单打印 模块 ,卫永乐*/
procedure tongji_shbx(PI_AAC001 in varchar2,
PO_FHZ    out varchar2,
PO_MSG    out varchar2) is
v_cnt          number(2);
v_cnt_sd       number(2);
v_cic818       T_BXGX_SHBXCBQKCXJG_WYL.Cic818%type;
v_cic818_sd    T_BXGX_SHBXCBQKCXJG_WYL.Cic818%type;
v_cic819       T_BXGX_SHBXCBQKCXJG_WYL.Cic819%type;
v_aae042_ac20  ac20.aae042%type;
v_aae041_ac20  ac20.aae041%type;
v_aae041_sac14 sac14.aae041%type;
v_aae042_sac14 sac14.aae042%type;
v_aae180_sac14 sac14.aae180%type;
v_yf           number(2);
v_Prc          Varchar2(20);
v_Prcname      Varchar2(200);
v_Params       Varchar2(500);
cursor cur_t is
select count(1) cnt, aae001
from T_BXGX_SHBXCBQKCXJG_WYL
where aac001 = pi_aac001
and aae087 in ('0', '1')
group by aae001
order by aae001;
begin
-- 初始化返回值
Po_Fhz    := '1';
Po_Msg    := '';
v_Prc     := '.tongji_shbx';
v_Prcname := c_Pkg_Name || v_Prc;
v_Params  := ',传入参数为:pi_aac001=' || Pi_Aac001;
-- 自建表 T_BXGX_SHBXCBQKCXJG_WYL  1000745288
/*
从这里取值,可以直接复制到  表 T_BXGX_SHBXCBQKCXJG_WYL 中
select bae001,
aae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
cic818,
sum(cic819) cic819,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz
from v_bxgx_shbxcbqkcxjg_xgy_
where aac001 = 1000745288
group by bae001,
aae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
cic818,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz order by aae001;*/
-- 清空临时表
delete from T_BXGX_SHBXCBQKCXJG_WYL where aac001 = pi_aac001;
delete from T_BXGX_SHBXCBQKCXJG_WYL_ where aac001 = pi_aac001;
/*插入数据*/

insert into T_BXGX_SHBXCBQKCXJG_WYL
select bae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
aae001,
cic818,
sum(nvl(cic819, 0)) cic819,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz
from v_bxgx_shbxcbqkcxjg_xgy_
where aac001 = pi_aac001
group by bae001,
aae001,
aac001,
cac002,
aac003,
aac004,
aac002,
csrq,
cgrq,
aae200,
aab999,
aab004,
cic818,
aic058,
aic074,
aic072,
aic075,
aic076,
aic077,
aic078,
aic079,
aae087,
jfsm,
cbzt,
ccjfrq,
zmjfrq,
dqjfgz
order by aae001;
insert into T_BXGX_SHBXCBQKCXJG_WYL_
select * from T_BXGX_SHBXCBQKCXJG_WYL where aac001 = pi_aac001;
-- 判断是否有多条,有多条就算是有转入的
-- select count(1),aae001 into v_cnt from T_BXGX_SHBXCBQKCXJG_WYL where aac001 = pi_aac001 group by aae001 order by aae001;
for v_cur in cur_t loop

if v_cur.cnt > 1 then
select sum(nvl(cic818, 0)) cic818_hj
into v_cic818
from T_BXGX_SHBXCBQKCXJG_WYL
-- altered by weiyongle
where aae001 = v_cur.aae001
and aac001 = pi_aac001;

select sum(nvl(cic819, 0)) cic819_hj
into v_cic819
from T_BXGX_SHBXCBQKCXJG_WYL
-- altered by weiyongle 20160707
where aae001 = v_cur.aae001
and aac001 = pi_aac001;

update T_BXGX_SHBXCBQKCXJG_WYL_ a
set a.cic818 = v_cic818
where aac001 = pi_aac001
and aae001 = v_cur.aae001;
-- 因为有两条,一条为转入,一条为本地,所以要 删除一条,然后更新
delete from T_BXGX_SHBXCBQKCXJG_WYL_
where aac001 = pi_aac001
and aae001 = v_cur.aae001
and aae087 = '1';
update T_BXGX_SHBXCBQKCXJG_WYL_ a
set a.cic819 = v_cic819
where aac001 = pi_aac001
and aae001 = v_cur.aae001;

-- 修正 转入的月份
select max(aae042)
into v_aae042_ac20
from ac20
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001
/*and aac402 = '0';*/
and aac402 in ('0', '1');
select min(aae041)
into v_aae041_ac20
from ac20
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001
/*and aac402 = '0';*/
and aac402 in ('0', '1');
select max(aae042)
into v_aae042_sac14
from sac14
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;
select min(aae041)
into v_aae041_sac14
from sac14
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;
-- 20160801 增加 sac14.aae180为空的 判断
select nvl(aae180, 0)
into v_aae180_sac14
from sac14
where aac001 = pi_aac001
and aae140 = '110'
and substr(aae041, 1, 4) = v_cur.aae001;

begin
/* add by weiyongle 20160719
初始化v_yf,循环的时候 ,如果不初始化 变量那么在下一次循环的时候变量
还会保留上一次的值,导致在这一次的循环的数值不正确*/
v_yf := 0;
-- add by weiyongle 20160719 如果某一个变量为空,那么就不执行
if v_aae042_ac20 = null or v_aae041_sac14 = null or
v_aae042_ac20 = null or v_aae041_ac20 = null then
return;
else
if v_aae042_ac20 <= v_aae041_sac14 or
v_aae042_sac14 <= v_aae041_ac20 then

/*decode((v_aae042_sac14 - v_aae041_sac14 + 1) * nvl(a.aae180, 0),
0,
0,
(v_aae042_sac14 - v_aae041_sac14 + 1))
decode 函数在存储过程中不能使用
pkg_weiyl.getMonthNum(v_aae041_sac14,v_aae042_sac14,v_aae180_sac14)
*/

/*v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 + v_aae042_sac14 -
v_aae041_sac14 + 1;*/
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 +
pkg_weiyl.getMonthNum(v_aae041_sac14,
v_aae042_sac14,
v_aae180_sac14);

-- 有重合的情况
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 < v_aae042_sac14 and
v_aae041_ac20 <= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 +
pkg_weiyl.getMonthNum(v_aae041_sac14,
v_aae042_sac14,
v_aae180_sac14) -
(v_aae042_ac20 - v_aae041_sac14 + 1);
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 < v_aae042_sac14 and
v_aae041_ac20 >= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 +
pkg_weiyl.getMonthNum(v_aae041_sac14,
v_aae042_sac14,
v_aae180_sac14) -
(v_aae042_ac20 - v_aae041_ac20 + 1);
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 < v_aae042_sac14 and
v_aae041_ac20 >= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 +
pkg_weiyl.getMonthNum(v_aae041_sac14,
v_aae042_sac14,
v_aae180_sac14) -
(v_aae042_ac20 - v_aae041_ac20 + 1);
Elsif v_aae042_ac20 > v_aae041_sac14 and
v_aae042_ac20 >= v_aae042_sac14 and
v_aae041_ac20 <= v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1;

Elsif v_aae042_ac20 >= v_aae042_sac14 and
v_aae041_ac20 > v_aae041_sac14 Then
v_yf := v_aae042_ac20 - v_aae041_ac20 + 1 +
(pkg_weiyl.getMonthNum(v_aae041_sac14,
v_aae042_sac14,
v_aae180_sac14)) -
(v_aae041_ac20 - v_aae041_sac14 + 1);
end if;
end if;
end;

-- 增加 失地农民账户类别的判断 add by weiyongle 20160728
--先清空 变量
begin
v_cic818_sd := 0;
v_cnt_sd    := 0;
select count(aac001)
into v_cnt_sd
from sic86
where aac001 = pi_aac001
and aae001 = v_cur.aae001
and aae087 = '2';
if v_cnt_sd > 0 then
select cic818
into v_cic818_sd
from sic86
where aac001 = pi_aac001
and aae001 = v_cur.aae001
and aae087 = '2';
v_yf := v_yf + v_cic818_sd;
end if;
end;

-- 如果大于12,那么就设置为12
if v_yf > 12 then
v_yf := 12;
end if;
update T_BXGX_SHBXCBQKCXJG_WYL_ a
set a.cic818 = v_yf
where aac001 = pi_aac001
and aae001 = v_cur.aae001;
update T_BXGX_SHBXCBQKCXJG_WYL_
set jfsm = cic818
where aac001 = pi_aac001;

-- 针对 失地农民账户类别的判断 add by weiyongle 20160728
begin
v_cic818_sd := 0;
v_cnt_sd    := 0;
select count(aac001)
into v_cnt_sd
from sic86
where aac001 = pi_aac001
and aae001 = v_cur.aae001
and aae087 = '2';
if v_cnt_sd > 0 then
delete from T_BXGX_SHBXCBQKCXJG_WYL_ a
where aac001 = pi_aac001
and a.aae001 = v_cur.aae001
and a.aae087 = '2';
end if;
end;

end if;

end loop;

exception
when others then
Po_Fhz := v_Prcname || '_91,重新统计月份出错';
Po_Msg := Pkg_Fun.f_Errmsg(v_Prcname, Sqlcode, Sqlerrm, v_Params);

end tongji_shbx;

/*批量赋权限,我自己的权限放在表 fw_operator2right_wyl_ 中 */
procedure prc_right(pi_loginid       in varchar2,
pi_loginid_other in varchar2,
po_fhz           out varchar2,
po_msg           out varchar2) is
v_bae001   fw_operator.bae001%type;
v_procname varchar2(200);
v_operid   fw_operator.operid%type;
-- 所有权限
/*cursor cur_fw_right is
select * from fw_right;*/
--赋予相同的权限
cursor cur_fw_right is
select *
from fw_operator2right a
where a.operid = (select operid
from fw_operator k
where k.loginid = pi_loginid_other);
begin
v_procname := 'pkg_weiyongle.prc_right';
po_fhz     := '1';
po_msg     := v_procname || '赋权成功!';
select bae001, a.operid
into v_bae001, v_operid
from fw_operator a
where a.loginid = pi_loginid;
-- 删除
delete from fw_operator2right a where a.operid = v_operid;
for v_cur_right in cur_fw_right loop
/*return;*/
--增加
insert into fw_operator2right
(ID,
operid,
RIGHTID,
AUTHTYPE,
AAE100,
VALIDFROM,
VALIDTO,
BAE002,
BAE004)
values
(seq_fw_operator2right.nextval,
v_operid,
v_cur_right.rightid,
'1',
v_cur_right.aae100,
20160522161615,
20160712160146,
'20004390',
'20004390');
end loop;
EXCEPTION
WHEN OTHERS THEN
po_fhz := '_999';
po_msg := '增加权限失败,sqlerrm:' || sqlerrm;
return;
end prc_right;

/* 测试goto 的用法,

*/
procedure test_loop_go(pi_aab001 in number,
po_fhz    out varchar2,
po_msg    out varchar2) is
cursor cur_ac02 is
select * from ac02 where aab001 = pi_aab001;
v_ctk001 stk03.ctk001%type;
v_cnt    number(6);
v_nnd    number(4);
begin
/* SELECT count(c.nn),nn*5
into v_ctk001,v_nnd
FROM SKC04 A, AC02 B, v_ac01_groupbyNNd C
WHERE A.AAC001 = B.AAC001
AND B.AAC001 = C.AAC001
AND B.AAE140 = '310'
AND A.CKA549 = '1'
\* AND substr(A.AAE036, 1, 6) = PI_AAE043*\
AND A.AAE100 = '1'
\*AND B.BAE001 = NVL(PI_BAE001, B.BAE001)*\
group by c.nn;  */

-- aab001 = 511500009511 ,
-- aac001 = 1000687490 ,如果是 1000687490 这个人,那么就不更新
-- aac001 = 1000687529 ,如果是 1000687529 这个人,那么就不更新
set transaction name 'tran_1';
for v_cur in cur_ac02 loop

if v_cur.aac001 = 1000687490 then
goto the_next;
elsif v_cur.aac008 = 1 then
update ac02 a
set a.aac008 = 6
where aac001 = v_cur.aac001
and aae140 = v_cur.aae140;
end if;

<<the_next>>
null;
end loop;
commit;
end test_loop_go;

/*
集合变量以及自定义异常的练习
*/
procedure record_practice(pi_aac001 in number,
po_fhz    out varchar2,
po_msg    out varchar2) is
v_cur_sac14 sac14%rowtype;
-- 定义一个集合类型 方式 1
type table_sac14 is table of sac14%rowtype index by pls_integer;
--定义一个集合类型的变量
sac14_tab table_sac14;

-- 定义一个集合类型 方式2
type table_ac01_ae01 is record(
aac001 ac01.aac001%type,
aab001 ac01.aab001%type,
aab999 ae01.aab999%type);
--定义一个集合类型的变量
ac01_ae01_tab table_ac01_ae01;

-- 自定义一个异常
aae180_is_null_exp exception;
--给自定义异常赋错误代码,必须 在 -20000到 -20999之间
pragma exception_init(aae180_is_null_exp, -20001);

v_aae180    number(5);
v_sqlerrm   varchar2(200);
v_proc      varchar2(200) := c_Pkg_Name || '.record_practice';
v_params    varchar2(200) := 'pi_aac001=' || pi_aac001;
v_cnt_sac14 number(3);
-- 嵌套子过程
procedure validate_aae180 is
begin
select count(1) into v_cnt_sac14 from sac14 where aac001 = pi_aac001;
if v_cnt_sac14 = 0 then
raise_application_error(-20002,
'the person has not sac14,please confirm!');
return;
end if;
select a.* bulk collect
into sac14_tab
from sac14 a
where a.aac001 = pi_aac001;
for v_index in sac14_tab.first .. sac14_tab.last loop
-- 把集合类型变量赋值给一个 rowtype行类型变量
v_cur_sac14 := sac14_tab(v_index);
/*select nvl(v_cur_sac14.aae180, -99) into v_aae180 from dual;
\*if nvl(v_cur_sac14.aae180, -99) = -99 then*\
if v_aae180 = -99 then*/
if v_cur_sac14.aae180 is null then
raise aae180_is_null_exp;
/* raise_application_error(-20001, 'aae180 can not be null');*/
return;
end if;
end loop;
exception

when others then
po_fhz := '-98';
po_msg := '未知错误98,sqlerrm:' || sqlerrm;
-- 增加自定义过程的判断
v_sqlerrm := substr(sqlerrm, 1, 9);
if v_sqlerrm = 'ORA-20001' then
po_fhz := '_001';
po_msg := v_params || ',该人员' || v_cur_sac14.aae041 ||
'的基数为空,请检查!,sqlerrm=' || sqlerrm;
end if;
return;
end validate_aae180;
begin
-- 初始化返回值
po_fhz := '-1';
po_msg := 'the init state';
--调用用于校验aae180的嵌套子过程 validate_aae180
validate_aae180;
exception
when others then
po_fhz := '-99';
po_msg := '未知错误,sqlerrm:' || sqlerrm;
return;
end record_practice;

--- 统计部分
/*
1 统计全市2015年的住院情况,开始日期,终止日期,病种,就诊医院等
select temp_func_WYL('BAE001', bae001) BAE001,
a.aac003,
a.aac002,
b.ckc546,
substr(b.ckc537, 1, 8) ks,
substr(b.ckc538, 1, 8) zz,
b.ckb519
from ac01 a, kc21 b
where a.aac001 = b.aac001
and b.ckc544 = '2'
and substr(b.ckc538, 1, 4) = 2015
-- AND A.AAB001 = 511500012810
group by a.bae001, AAC003, AAC002, CKC546, b.ckc537, b.ckc538, CKB519
order by a.bae001;*/

Begin
Null;
End Pkg_Weiyl;
/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: