create or replace procedure sp_upd_sch_dates is
l_sql VARCHAR(4000);
l_sql2 VARCHAR(4000);
l_sql3 VARCHAR(4000);
v_taskname VARCHAR2(128);
v_schid VARCHAR2(15);
v_taskid VARCHAR2(15);
v_weekday varchar2(12);
v_startdate Date;
v_finishdate Date;
v_base_date Date;
v_status Integer;
v_lag_time Integer;
v_lag_time2 Integer;
v_tasktype Integer;
type pre_cur is ref cursor;
s_sch_cur pre_cur;
s_sch_task_cur pre_cur;
s_sch_task_cur2 pre_cur;
begin
l_sql := ' select schtsk.rschedule_tagu schid,ceil(schtskfrmexe.pactual_finish_date-schtskfrminf.pfinish_date) lag_time,schtskfrminf.pstart_date
from infodba.PSCHEDULETASK schtsk
join infodba.pworkspaceobject schtskobj on schtsk.puid = schtskobj.puid
join infodba.pitem schtskitm on schtsk.puid = schtskitm.puid
join infodba.pitemrevision schtskitmrev on schtskitm.puid = schtskitmrev.ritems_tagu
join infodba.PSCHEDULETASKREVISION schtskrev on schtskrev.puid = schtskitmrev.puid
join infodba.pimanrelation schtskrevrel on schtskrev.puid = schtskrevrel.rprimary_objectu --任务信息
join infodba.pform schtskrevrelfrm on schtskrevrel.rsecondary_objectu= schtskrevrelfrm.puid
join infodba.pimanrelation schtskrevrelexe on schtskrev.puid = schtskrevrelexe.rprimary_objectu --任务执行信息
join infodba.pform schtskrevfrmexe on schtskrevrelexe.rsecondary_objectu= schtskrevfrmexe.puid
join infodba.PTASKSCHEDULINGFORMINFO schtskfrminf on schtskrevrelfrm.rdata_fileu= schtskfrminf.puid
join infodba.PTASKEXECUTIONFORMINFO schtskfrmexe on schtskrevfrmexe.rdata_fileu= schtskfrmexe.puid
where schtskobj.pobject_name in (''概念图面确认'',''细化图面确认'',''外观模型确认'')
and schtskfrmexe.pactual_finish_date > schtskfrminf.pfinish_date';
open s_sch_cur for l_sql;
loop
<>
fetch s_sch_cur into v_schid, v_lag_time, v_base_date;
exit when s_sch_cur%notfound;
l_sql2 := 'select schtskfrminf.puid,schtskfrminf.pstart_date,schtskfrminf.pfinish_date
from infodba.PSCHEDULETASK schtsk
join infodba.pworkspaceobject schtskobj on schtsk.puid = schtskobj.puid
join infodba.pitem schtskitm on schtsk.puid = schtskitm.puid
join infodba.pitemrevision schtskitmrev on schtskitm.puid = schtskitmrev.ritems_tagu
join infodba.PSCHEDULETASKREVISION schtskrev on schtskrev.puid = schtskitmrev.puid
join infodba.pimanrelation schtskrevrel on schtskrev.puid = schtskrevrel.rprimary_objectu --任务信息
join infodba.pform schtskrevrelfrm on schtskrevrel.rsecondary_objectu= schtskrevrelfrm.puid
join infodba.pimanrelation schtskrevrelexe on schtskrev.puid = schtskrevrelexe.rprimary_objectu --任务执行信息
join infodba.pform schtskrevfrmexe on schtskrevrelexe.rsecondary_objectu= schtskrevfrmexe.puid
join infodba.PTASKSCHEDULINGFORMINFO schtskfrminf on schtskrevrelfrm.rdata_fileu= schtskfrminf.puid
join infodba.PTASKEXECUTIONFORMINFO schtskfrmexe on schtskrevfrmexe.rdata_fileu= schtskfrmexe.puid
where schtskfrmexe.pstatus <> 3
and schtskrev.ptask_type = 0
and schtsk.rschedule_tagc=' || v_schid ||
'order by schtskfrminf.pstart_date asc';
open s_sch_task_cur for l_sql2;
<<loop2>>
loop
fetch s_sch_task_cur into v_taskname, v_taskid, v_startdate, v_finishdate, v_status, v_tasktype;
exit when s_sch_task_cur%notfound;
v_weekday := '';
if v_status in (0, 1, 2, 5) and v_startdate > v_base_date then
if v_taskname = '立项评审(M10)' then
v_lag_time2 := v_lag_time;
end if;
select to_char(v_startdate + v_lag_time,'day') into v_weekday from dual;
if v_weekday in ('星期六','星期日') then
v_lag_time := v_lag_time + 2;
end if;
update infodba.ptaskschedulingforminfo
set pstart_date = to_date(to_char(pstart_date + v_lag_time,'yyyy-mm-dd'))
where ptaskschedulingforminfo.puid = v_taskid;
select to_char(v_finishdate + v_lag_time,'day') into v_weekday from dual;
if v_weekday in ('星期六','星期日') then
v_lag_time := v_lag_time + 2;
end if;
update infodba.ptaskschedulingforminfo
set pfinish_date = to_date(to_char(pfinish_date + v_lag_time,'yyyy-mm-dd hh24:mi:ss'))
where ptaskschedulingforminfo.puid = v_taskid;
end if;
end loop;
close s_sch_task_cur;
l_sql3 := 'select schtskfrminf.puid,schtskfrminf.pstart_date,schtskfrminf.pfinish_date
from infodba.PSCHEDULETASK schtsk
join infodba.pworkspaceobject schtskobj on schtsk.puid = schtskobj.puid
join infodba.pitem schtskitm on schtsk.puid = schtskitm.puid
join infodba.pitemrevision schtskitmrev on schtskitm.puid = schtskitmrev.ritems_tagu
join infodba.PSCHEDULETASKREVISION schtskrev on schtskrev.puid = schtskitmrev.puid
join infodba.pimanrelation schtskrevrel on schtskrev.puid = schtskrevrel.rprimary_objectu --任务信息
join infodba.pform schtskrevrelfrm on schtskrevrel.rsecondary_objectu= schtskrevrelfrm.puid
join infodba.pimanrelation schtskrevrelexe on schtskrev.puid = schtskrevrelexe.rprimary_objectu --任务执行信息
join infodba.pform schtskrevfrmexe on schtskrevrelexe.rsecondary_objectu= schtskrevfrmexe.puid
join infodba.PTASKSCHEDULINGFORMINFO schtskfrminf on schtskrevrelfrm.rdata_fileu= schtskfrminf.puid
join infodba.PTASKEXECUTIONFORMINFO schtskfrmexe on schtskrevfrmexe.rdata_fileu= schtskfrmexe.puid
where schtskfrmexe.pstatus <> 3
and schtskrev.ptask_type <> 0
and schtsk.rschedule_tagc=' || v_schid ||
'order by schtskrev.ptask_type asc';
open s_sch_task_cur2 for l_sql3;
<<loop3>>
loop
fetch s_sch_task_cur2 into v_taskname, v_taskid, v_startdate, v_finishdate, v_status, v_tasktype;
exit when s_sch_task_cur2%notfound;
if v_taskname = '工业设计' and v_status in (0, 1, 2, 5) then
update infodba.ptaskschedulingforminfo
set pfinish_date = to_date(to_char(pfinish_date + v_lag_time2,'yyyy-mm-dd hh24:mi:ss'))
where ptaskschedulingforminfo.puid = v_taskid;
else
update infodba.ptaskschedulingforminfo
set pfinish_date = to_date(to_char(pfinish_date + v_lag_time,'yyyy-mm-dd hh24:mi:ss'))
where ptaskschedulingforminfo.puid = v_taskid;
end if;
end loop;
close s_sch_task_cur2;
end loop;
commit;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
dbms_output.put_line(dbms_utility.format_error_backtrace);
end sp_upd_sch_dates;