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万条记录