传入两个参数:表名和日期字段名,要找出日期字段不连续的部分,并用前一条纪录填充以增加记录(日期字段不断加1,其他字段复制)进行补缺。从而生成一张日期连续递增不空缺的新表。
日期字段是日期类型
比如:传入参数只有表名“TableN”和日期字段名“DateA”,而实际表TableN中还包含ValueB和ValueC……等字段。而操作不变,日期字段DateA进行补充,ValueB、ValueC等字段进行复制。
用游标又怎么实现??请教前辈。
填充前的表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
日期字段是日期类型
比如:传入参数只有表名“TableN”和日期字段名“DateA”,而实际表TableN中还包含ValueB和ValueC……等字段。而操作不变,日期字段DateA进行补充,ValueB、ValueC等字段进行复制。
用游标又怎么实现??请教前辈。
填充前的表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
create or replace procedure p_test(tab_name in varchar2,field_name in varchar2)
is
v_datea NUMBER;
v_datea_old date;
v_datea_new date;
v_valueb_old NUMBER;
v_valuec_old NUMBER;
begin
v_datea_old:='';
for tabN in(select datea,valueb,valuec from tablen order by datea) loop
v_datea_new:=tabN.datea;
if nvl(v_datea_old,'nnn')<>'nnn' AND v_datea_old+1<v_datea_new then
v_datea:=v_datea_new-v_datea_old;
SELECT valueb,valuec INTO v_valueb_old,v_valuec_old
FROM tablen WHERE datea=v_datea_old;
FOR n IN 1..v_datea-1 LOOP
v_datea_old:=v_datea_old+n;
INSERT INTO tableN_new(datea,valueb,valuec)
VALUES(v_datea_old,v_valueb_old,v_valuec_old);
END LOOP;
end if;
INSERT INTO tableN_new(datea,valueb,valuec)
VALUES(v_datea_new,tabN.valueb,tabN.valuec);
v_datea_old:=v_datea_new;
end loop;
end p_test;
如果,还有valued、valuee等字段,就得改这个存储过程了~~~~
有一个思路:Oracle里有记录型的变量,可以存储fetch出来的整条记录。
如果用记录型变量记录从游标fetch出来的整行记录,保留日期,再把这条记录整条添加,并修改top 1的的时间为保留日期的后面一天,就实现了添加一条日期不存在的记录了。
但具体得如何实现???
请教高手...