--create or replace procedure proc_card_operate is 工作模式用其替换declare
declare
cursor vcursor_pay is select * from jn1_pay where tgflag = '1' and gencardflag ='0' and risktype<>'C' order by id;
type vtype_pay is table of jn1_pay%rowtype index by binary_integer;
--type vtype_amount is table of jn1_pay.amount%type;
vrow_card jn_card%rowtype;
v_flag jn_card.flag%type;
v_max_tmount jn1_pay.tmount%type;
v_allamt jn_card.allamt%type;
v_update_count integer := 0;
--以上五个为升降级变量
vrow_pay jn1_pay%rowtype;
vtable_pay vtype_pay;
v_risktype jn1_pay.risktype%type;
v_paycode jn1_pay.paycode%type;
v_max_amount jn1_pay.amount%type;
v_a_amount jn1_pay.amount%type;
v_e_amount jn1_pay.amount%type;
v_f_amount jn1_pay.amount%type;
v_cardno cardno.newcardno%type;
v_cardtype jn_card.cardtype%type;
v_date jn_card.recdate%type;
v_xztype jn_card.xztype%type;
v_jftype jn_card.jftype%type;
v_check_id boolean;
v_islast boolean;
v_pay_count integer;
v_count integer;
v_s_type_count integer := 0;
v_j_type_count integer := 0;
c_factor constant number := 0.05;
begin
savepoint p_full;
open vcursor_pay;
loop
fetch vcursor_pay bulk collect into vtable_pay limit 1000;
if v_islast then
v_pay_count:=1;
else
v_pay_count:=vtable_pay.count;
end if;
for i in 1..v_pay_count loop
savepoint p_part;
--vrow_pay.id is null用于第一条记录,v_islast用于最后一条记录
if( vrow_pay.id is null or v_islast or vtable_pay(i).id<>vrow_pay.id) then
if(v_check_id) then
--缴费方式 A-年缴 B-趸缴 C-其它(不定期)
v_jftype := 'A';
if(v_a_amount>=v_e_amount and v_a_amount>=v_f_amount) then
v_max_amount:=v_a_amount;
v_xztype := 'A';
elsif(v_e_amount>=v_f_amount) then
v_max_amount:=v_e_amount;
v_xztype := 'E';
v_jftype := 'C';
else
v_max_amount:=v_f_amount;
v_xztype := 'F';
end if;
--判断是否有卡
select count(id) into v_count from jn_card where cardflag='1' and ompno=vrow_pay.ompno and id=vrow_pay.id;
select sysdate into v_date from dual;
if v_count=0 then
if(v_max_amount>=60000) then
if(v_max_amount>=100000) then
v_cardtype:='S';
v_s_type_count := v_s_type_count+1;
else
v_cardtype:='J';
v_j_type_count := v_j_type_count+1;
end if;
select replace(lpad(max(newcardno)+1,11,'0'),'4','5') into v_cardno from cardno;
--flag发卡标志 0-新 1-升降 2-已制卡 3-失效后不能制卡
--status领卡状态 Y-已领卡 N-未领卡
insert into jn_card(ompno,id,cardflag,grpcode,cardtype,cardno,xztype,jftype,allamt,recdate,flag,operno,operdate,empno,deptno,frecdate,status)
values(vrow_pay.ompno,vrow_pay.id,'1',null,v_cardtype,v_cardno,v_xztype,v_jftype,v_max_amount,v_date,'0',null,vrow_pay.otime,vrow_pay.empno,vrow_pay.deptno,v_date,'N');
update jn1_pay set gencardflag='1' where id =vrow_pay.id;
insert into cardno (newcardno) values (v_cardno);
else
update jn1_pay set gencardflag='2',otime=sysdate where id =vrow_pay.id;
end if;
else
--新标准升降级
if(v_max_amount>=60000) then
if(v_max_amount>=100000) then
v_cardtype:='S';
else
v_cardtype:='J';
end if;
else
v_cardtype:='D';
end if;
select * into vrow_card from jn_card where cardflag='1' and ompno=vrow_pay.ompno and id=vrow_pay.id;
--A、B需要结合新老两种标准
if(vrow_card.cardtype='B' and vrow_card.xztype<>'E') then
--cardtype='B'和xztype<>'E'的情况用tmount计算
v_allamt:=v_max_tmount;
else
v_allamt:=v_max_amount;
end if;
if((vrow_card.cardtype='A' or vrow_card.cardtype='B') and v_cardtype='D' and v_allamt>=vrow_card.allamt) then
v_cardtype:=vrow_card.cardtype;
end if;
if(vrow_card.cardtype<>v_cardtype) then
v_flag:=1;
select replace(lpad(max(newcardno)+1,11,'0'),'4','5') into v_cardno from cardno;
insert into jn_chgcard(ompno,id,oldcardno,oldcardtype,newcardno,newcardtype,begdate,empno,deptno,operno,operdate)
values (vrow_card.ompno,vrow_card.id,vrow_card.cardno,vrow_card.cardtype,v_cardno,v_cardtype,vrow_card.frecdate,vrow_card.empno,vrow_card.deptno,vrow_card.operno,v_date);
insert into cardno (newcardno) values (v_cardno);
v_update_count:=v_update_count+1;
dbms_output.put_line(vrow_card.cardtype||','||vrow_card.allamt||'===>'||v_cardtype||','||v_allamt);
else
v_flag:=0;
v_cardno:=vrow_card.cardno;
end if;
update jn_card set cardno=v_cardno,cardtype=v_cardtype,xztype=v_xztype,jftype=v_jftype,allamt=v_allamt,operdate=v_date,flag=v_flag,recdate=v_date
where cardflag='1' and ompno=vrow_card.ompno and id=vrow_card.id;
update jn1_pay set gencardflag='1' where id =vrow_card.id;
end if;
end if;
--退出当前循环
exit when v_islast;
select count(id) into v_count from jn1_custmatl where id not in
(select id from jn_dummy) and id=vtable_pay(i).id;
if v_count=0 then
v_check_id := false;
update jn1_pay set gencardflag='2',otime=sysdate where id =vtable_pay(i).id;
else
v_check_id := true;
v_a_amount:=0;
v_e_amount:=0;
v_f_amount:=0;
v_max_tmount:=0;
end if;
end if;
if(v_check_id) then
v_risktype := vtable_pay(i).risktype;
v_paycode := vtable_pay(i).paycode;
case
when v_risktype='A'then
if(v_paycode='01') then
v_a_amount := v_a_amount+(vtable_pay(i).amount*c_factor*2);
elsif(v_paycode='13') then
v_a_amount := v_a_amount+(vtable_pay(i).amount*c_factor*2*10);
end if;
when v_risktype='E'then
v_e_amount := v_e_amount+(vtable_pay(i).amount*c_factor);
when v_risktype='F'then
if(v_paycode='01') then
v_f_amount := v_f_amount+(vtable_pay(i).amount*c_factor);
elsif(v_paycode='13') then
v_f_amount := v_f_amount+(vtable_pay(i).amount*c_factor*10);
end if;
else null;
end case;
--老银卡需要计算tmount,E类账户险种除外
if(vtable_pay(i).tmount>v_max_tmount) then
v_max_tmount := vtable_pay(i).tmount;
end if;
vrow_pay:=vtable_pay(i);
end if;
end loop;
--exit when vcursor_pay%notfound;
--在最后一条记录后面再循环一次
exit when v_islast;
if vcursor_pay%notfound then
v_islast := true;
end if;
end loop;
close vcursor_pay;
insert into ids values('J:'||v_j_type_count||' S:'||v_s_type_count||' U:'||v_update_count,sysdate);
exception when others then
rollback to savepoint p_full;
end;
分享到:
相关推荐
根据提供的文件信息,我们可以从标题、描述以及部分代码中提炼出关于Oracle Procedure的关键知识点。以下是对这些知识点的详细解析: ### Oracle Procedure概述 **Oracle Procedure** 是一种存储过程,在Oracle...
2. **代码重用**:存储过程可以被多次调用,减少了重复编码的工作量。 3. **安全性**:通过存储过程可以限制用户对数据库的直接访问权限,从而提高安全性。 4. **复杂逻辑处理**:存储过程支持使用流程控制语句,如...
赠送jar包:hbase-procedure-1.4.3.jar; 赠送原API文档:hbase-procedure-1.4.3-javadoc.jar; 赠送源代码:hbase-procedure-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-procedure-1.4.3.pom; 包含翻译后...
赠送jar包:hbase-procedure-1.1.3.jar; 赠送原API文档:hbase-procedure-1.1.3-javadoc.jar; 赠送源代码:hbase-procedure-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-procedure-1.1.3.pom; 包含翻译后...
标题“Delphi procedure and function”指向了编程领域中的一个具体概念,即Delphi语言中两种重要的代码组织单元:过程(procedure)和函数(function)。Delphi是一种快速应用程序开发工具,它使用Object Pascal...
CREATE PROCEDURE procedure_name (param1 type, param2 type, ...) AS BEGIN -- SQL statements and control flow here END ``` 在这里,`procedure_name` 是存储过程的名称,`param1`, `param2` 等是输入参数,`...
《DB2ADMIN.doc:CREATE PROCEDURE详解及调用方法》 在数据库管理中,存储过程是一种预编译的SQL代码集合,它被保存在数据库中,可以被多次调用,提高了数据处理的效率和应用程序的性能。本文将深入探讨DB2数据库中...
下面将详细介绍Oracle procedure的一些关键知识点。 1. **创建存储过程**: 创建存储过程的基本语法如下: ```sql CREATE OR REPLACE PROCEDURE procedure_name (parameter_list) AS declaration_section ...
### Procedure Call Standard for the ARM® Architecture #### 关于文档 《Procedure Call Standard for the ARM® Architecture》是一份详细描述ARM架构应用程序二进制接口(ABI)中过程调用标准的重要文档。该...
本篇文章将深入探讨Oracle中的JOB、PROCEDURE(存储过程)和CURSOR(游标)的使用,这些是Oracle数据库开发中的核心概念。 首先,我们来看Oracle中的JOB。JOB是一种调度工具,允许用户在特定时间或间隔执行数据库...
在SQL Server中,`CREATE PROCEDURE` 是一个用于创建存储过程的关键字,它允许开发者定义一组预先编译的SQL语句,以便在未来重复使用。存储过程是数据库中的一个重要概念,它们提高了代码的重用性,简化了复杂的操作...
create or replace procedure qdy_pro2(p_cursor out qdy_package.qdy_cursor) is begin open p_cursor for select * from emp; end; --函数 create function qdy_fun1(name varchar2) return number is yearsal ...
### 访问存储过程(或函数)通过IBATIS中的Procedure标签定义Statement 在IBATIS框架中,访问数据库中的存储过程或者函数是一项常见的需求。本文将深入探讨如何利用IBATIS提供的`procedure`标签来定义这样的操作,...
A curve fitting procedure to derive inter-annual phenologies from time series of noisy satellite NDVI data
### 学习使用存储过程(Stored Procedure) 在IT领域中,存储过程(Stored Procedure)是一项重要的技术,尤其对于从事Web开发尤其是ASP编程的开发者来说,掌握如何使用存储过程至关重要。存储过程是一种预先编译并...
Oracle数据库中的“包”(Package)和“过程”(Procedure)是高级数据库编程的重要概念,它们在企业级应用开发中广泛使用。理解并熟练掌握这些概念对于任何Oracle数据库开发者来说都至关重要。 首先,我们来解释...
在Windows NT操作系统中,异步过程调用(Asynchronous Procedure Calls, APC)是一种重要的技术,用于在特定的线程上下文中执行任务,而无需线程持续监视或轮询。这种技术在Windows NT内核中扮演着重要角色,尤其是...
### 存储过程通用分页Procedure详解 #### 标题:存储过程通用分页Procedure 此标题明确指出了本文档的主要内容是关于一种通用的存储过程实现方式,用于数据库中的分页查询。分页是在数据库操作中非常常见的一种...
学习这些内容不仅有助于理解DB2存储过程的工作原理,还能提升你在数据库管理和开发方面的技能。通过实践这些教程,你可以更好地应对实际工作中的挑战,并为参加DB2的认证考试做好准备。在实际应用中,存储过程可以...
比如,文件可能包含创建表的语句,如`CREATE TABLE`,或者定义存储过程的语句,如`CREATE OR REPLACE PROCEDURE`。 PL/SQL中的游标是处理单行或多行结果集的重要工具。它们允许我们逐行处理查询结果,非常适合在...