CREATE OR REPLACE PROCEDURE scan_arrears_contract(dispersionMonth integer) as
--查询出“注销”、“审批通过”且没有被删除的合同
cursor c_contract is select * from Contract c WHERE (c.del is null or c.del=0) and (c.state=2 or c.state=4);
resultVal integer := 3;
curDate date;
function add_delayRecord(dispersionMonth integer,
contract_info contract%rowtype,
curDate date,b_type integer)return integer is
begin
declare
dspnMonths integer;
nextPayDate date;
lastDate taxfeeItem.Enddate%type;--最近的缴税费日期
begin
select max(endDate) into lastDate
from taxfeeitem
where contractId = contract_info.id
and billType = b_type and del!=1;
if(lastDate is null) then--如果取出的最近缴税日期为null则认为欠费
INSERT INTO DELAYRECORD(id,contractId,ownerId,ownerName,ownerType,lesseeType,lesseeId,lesseeName,
registerType,contractType,contractClass,registerNo,contractNo,originId,archiveNo,
payforway,startDate,endDate,housePurpose,contractCost,realCost,square,price,areaId,
houseAddress, scanDate,delayStartDate,delayEndDate,costType,isDeal,Del)
values (SYS_GUID(),contract_info.id,contract_info.ownerId,contract_info.ownerName,contract_info.OWNERTYPE,
contract_info.lesseeType,contract_info.lesseeId,contract_info.lesseeName,
contract_info.registerType,contract_info.contractType,contract_info.contractClass,
contract_info.registerNo,contract_info.contractNo,contract_info.originId,
contract_info.archiveNo,contract_info.payforway,contract_info.startDate,
contract_info.endDate,contract_info.housePurpose,contract_info.contractCost,
contract_info.realCost,contract_info.square,contract_info.price,contract_info.areaId,
contract_info.address,curDate,curDate,lastDate,b_type,1,0);
else
dspnMonths := trunc(months_between(lastDate,curDate));
--nextPayDate := to_date(get_next_date(to_date(lastDate,'yyyy-mm-dd')),'yyyy-mm-dd');
if(dspnMonths>=dispersionMonth) then--如果最近一次缴税日期与现在月数大于指定的月数则欠税
INSERT INTO DELAYRECORD(id,contractId,ownerId,ownerName,ownerType,lesseeType,lesseeId,lesseeName,
registerType,contractType,contractClass,registerNo,contractNo,originId,archiveNo,
payforway,startDate,endDate,housePurpose,contractCost,realCost,square,price,areaId,
houseAddress, scanDate,delayStartDate,delayEndDate,costType,isDeal,Del)
values (SYS_GUID(),contract_info.id,contract_info.ownerId,contract_info.ownerName,contract_info.OWNERTYPE,
contract_info.lesseeType,contract_info.lesseeId,contract_info.lesseeName,
contract_info.registerType,contract_info.contractType,contract_info.contractClass,
contract_info.registerNo,contract_info.contractNo,contract_info.originId,
contract_info.archiveNo,contract_info.payforway,contract_info.startDate,
contract_info.endDate,contract_info.housePurpose,contract_info.contractCost,
contract_info.realCost,contract_info.square,contract_info.price,contract_info.areaId,
contract_info.address,curDate,curDate,lastDate,b_type,1,0);
end if;
end if;
end;
return 1;
end add_delayRecord;
begin
curDate := current_date(); --获得当前时间
open c_contract;
loop--2开始遍历合同
DECLARE
contract_info contract%rowtype;
begin--3开始取合同
fetch c_contract into contract_info;
exit when c_contract%notfound;
begin--4开始taxfeeItem
resultVal := add_delayRecord(dispersionMonth,contract_info,curDate,1);--缴税的
resultVal := add_delayRecord(dispersionMonth,contract_info,curDate,2);--缴费的
end;--4结束taxFeeItem;
end;--3结束取合同
end loop;--2结束遍历合同
close c_contract;--关闭c_contract
end;
这个存储过程很低啊,我想做的就是根据合同表(contract)中的id去遍历税费明细表(taxfeeItem),看最大的enddate(用到了max)这个字段的值与当前时间比较是否大于某个月数,大则欠费,则insert进DELAYRECORD表,但是这效率很低,麻烦大家帮我看看,contract表中大概有6-7万条记录
--查询出“注销”、“审批通过”且没有被删除的合同
cursor c_contract is select * from Contract c WHERE (c.del is null or c.del=0) and (c.state=2 or c.state=4);
resultVal integer := 3;
curDate date;
function add_delayRecord(dispersionMonth integer,
contract_info contract%rowtype,
curDate date,b_type integer)return integer is
begin
declare
dspnMonths integer;
nextPayDate date;
lastDate taxfeeItem.Enddate%type;--最近的缴税费日期
begin
select max(endDate) into lastDate
from taxfeeitem
where contractId = contract_info.id
and billType = b_type and del!=1;
if(lastDate is null) then--如果取出的最近缴税日期为null则认为欠费
INSERT INTO DELAYRECORD(id,contractId,ownerId,ownerName,ownerType,lesseeType,lesseeId,lesseeName,
registerType,contractType,contractClass,registerNo,contractNo,originId,archiveNo,
payforway,startDate,endDate,housePurpose,contractCost,realCost,square,price,areaId,
houseAddress, scanDate,delayStartDate,delayEndDate,costType,isDeal,Del)
values (SYS_GUID(),contract_info.id,contract_info.ownerId,contract_info.ownerName,contract_info.OWNERTYPE,
contract_info.lesseeType,contract_info.lesseeId,contract_info.lesseeName,
contract_info.registerType,contract_info.contractType,contract_info.contractClass,
contract_info.registerNo,contract_info.contractNo,contract_info.originId,
contract_info.archiveNo,contract_info.payforway,contract_info.startDate,
contract_info.endDate,contract_info.housePurpose,contract_info.contractCost,
contract_info.realCost,contract_info.square,contract_info.price,contract_info.areaId,
contract_info.address,curDate,curDate,lastDate,b_type,1,0);
else
dspnMonths := trunc(months_between(lastDate,curDate));
--nextPayDate := to_date(get_next_date(to_date(lastDate,'yyyy-mm-dd')),'yyyy-mm-dd');
if(dspnMonths>=dispersionMonth) then--如果最近一次缴税日期与现在月数大于指定的月数则欠税
INSERT INTO DELAYRECORD(id,contractId,ownerId,ownerName,ownerType,lesseeType,lesseeId,lesseeName,
registerType,contractType,contractClass,registerNo,contractNo,originId,archiveNo,
payforway,startDate,endDate,housePurpose,contractCost,realCost,square,price,areaId,
houseAddress, scanDate,delayStartDate,delayEndDate,costType,isDeal,Del)
values (SYS_GUID(),contract_info.id,contract_info.ownerId,contract_info.ownerName,contract_info.OWNERTYPE,
contract_info.lesseeType,contract_info.lesseeId,contract_info.lesseeName,
contract_info.registerType,contract_info.contractType,contract_info.contractClass,
contract_info.registerNo,contract_info.contractNo,contract_info.originId,
contract_info.archiveNo,contract_info.payforway,contract_info.startDate,
contract_info.endDate,contract_info.housePurpose,contract_info.contractCost,
contract_info.realCost,contract_info.square,contract_info.price,contract_info.areaId,
contract_info.address,curDate,curDate,lastDate,b_type,1,0);
end if;
end if;
end;
return 1;
end add_delayRecord;
begin
curDate := current_date(); --获得当前时间
open c_contract;
loop--2开始遍历合同
DECLARE
contract_info contract%rowtype;
begin--3开始取合同
fetch c_contract into contract_info;
exit when c_contract%notfound;
begin--4开始taxfeeItem
resultVal := add_delayRecord(dispersionMonth,contract_info,curDate,1);--缴税的
resultVal := add_delayRecord(dispersionMonth,contract_info,curDate,2);--缴费的
end;--4结束taxFeeItem;
end;--3结束取合同
end loop;--2结束遍历合同
close c_contract;--关闭c_contract
end;
这个存储过程很低啊,我想做的就是根据合同表(contract)中的id去遍历税费明细表(taxfeeItem),看最大的enddate(用到了max)这个字段的值与当前时间比较是否大于某个月数,大则欠费,则insert进DELAYRECORD表,但是这效率很低,麻烦大家帮我看看,contract表中大概有6-7万条记录
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货