传入两个参数:表名和日期字段名,要找出日期字段不连续的部分,并用前一条纪录填充以增加记录(日期字段不断加1,其他字段复制)进行补缺。从而生成一张日期连续递增不空缺的新表。      
日期字段是日期类型      
比如:传入参数只有表名“TableN”和日期字段名“DateA”,而实际表TableN中还包含ValueB和ValueC……等字段(可能还有其他字段,不确定)。而操作不变,日期字段DateA进行补充,ValueB、ValueC等字段进行复制。      
用游标又怎么实现??  
有一个思路:Oracle里可以定义记录型的变量,可以存储fetch出来的整条记录。 
declare 
    cursor mycursor is
        select * from TableN order by DateA; --(用参数形式替代"TableN"和"DateA")
    cursorrecord1 mycursor%rowtype;--(cursorrecord存储整条取出来的记录)
    cursorrecord2 mycursor%rowtype;--(cursorrecord存储整条取出来的记录)
begin
    fetch mycursor into cursorrecord1;
    --将其中的DataA字段内容存到变量tmpdate中
    tmpdate:=cursorrecord1("DateA");--Oracle怎么将tmpdate赋值,高手指教
    while --条件:不是最后一条记录
    begin
        fetch mycursor into cursorrecord2;
        while --条件:tmpdate的后面一天<>cursorrecord2中的DateA字段
            --1.用该记录型变量cursorrecord1中的值(所有字段)添加新纪录,并把新记录中的DataA字段改为tmpdate加一
            --2.tmpdate加一,继续while循环,跳至第1.步
        end
        cursorrecord1:=cursorrecord2;--将cursorrecord1赋值为cursorrecord2,进行下一区间的判断
        tmpdate:=cursorrecord1("DateA");--
    end
end 
如果用记录型变量记录从游标fetch出来的整行记录,保留日期,再把这条记录整条添加,并修改top  1的的时间为保留日期的后面一天,就实现了添加一条日期不存在的记录了。  
但具体得如何实现???  
请教高手...  
  
填充前的表TableN        
DateA                           ValueB                ValueC    
2007-1-18                       1                          5  
2007-1-20                       3                          7  
2007-1-25                       6                          3  
   
填充后形成的新表:      
DateA                           ValueB                ValueC  
2007-1-18                       1                          5  
2007-1-19                       1                          5  
2007-1-20                       3                          7  
2007-1-21                       3                          7      
2007-1-22                       3                          7      
2007-1-23                       3                          7      
2007-1-24                       3                          7  
2007-1-25                       6                          3  

解决方案 »

  1.   

    declare
      v_date  date;
      v_date2 date;
      v_Vb    varchar2(20);
      v_Vc    varchar2(20);
      OPEN    myCursor FOR
        Select DateA, ValueB, ValueC From TableN order by DateA;  LOOP    FETCH myCursor INTO v_date, v_Vb, v_Vc;
      EXIT    WHEN myCursor%NOTFOUND;
    begin
      LOOP
        v_date2 := v_date + 1;
        select count(*) into col from TableN where DateA = v_date2;
        if col = 0 then
          insert into TableN values (v_date + 1, v_Vb, v_Vc);
          commit;
        elsif col = 1 then
        END LOOP;
      end if;
    end;
    END LOOP; 
    CLOSE myCursor;
    大概思路就是这个意思,你自己再调调吧
      

  2.   

    帮你调试了。记得给分。哇哈哈 ~~~
    declare
      col     number;
      v_date  date;
      maxdate date;
      Cursor myCursor is
        Select DateA, ValueB, ValueC From TableN order by DateA;
    begin
      select max(datea) into maxdate from tablen;
      for myCur in myCursor loop
        v_date := myCur.datea;
        LOOP
          v_date := v_date + 1;
          select count(*) into col from TableN where DateA = v_date;
          if col = 0 and v_date < maxdate then
            insert into TableN values (v_date, myCur.valueb, myCur.valuec);
            commit;
          else
            exit;
          end if;
        END LOOP;
      END LOOP;
    end;
      

  3.   

    不是很完全。
    如果,还有valued、valuee等字段,就得改这个存储过程。
    得用Oracle中的动态SQL实现。
    请教高手,具体如何实现?
      

  4.   

    select b.DateA, ***
    from TableN a,
    (select (mindate + rownum - 1) DateA 
    from (select min(DateA) mindate, max(DateA) maxdate from TableN)
    connect by rownum <= maxdate - mindate + 1) b
    where b.DateA = a.DateA(+);用这个应该可以生成完整日,不过你还要取前一条记录的值
    ***的地方可能要用到LAG函数
    周末没地方调试,可以试试