传入两个参数:表名和日期字段名,要找出日期字段不连续的部分,并用前一条纪录填充以增加记录(日期字段不断加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
日期字段是日期类型
比如:传入参数只有表名“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
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;
大概思路就是这个意思,你自己再调调吧
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;
如果,还有valued、valuee等字段,就得改这个存储过程。
得用Oracle中的动态SQL实现。
请教高手,具体如何实现?
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函数
周末没地方调试,可以试试