注意几点:
- 时间比较:TO_CHAR(EnableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd')
- 定义表:%rowtype ,例子: dormodel DISABLEOPERATIONRECORD%rowtype;--记录表
- 第一表字段:%Type ,例子: s_ipid INSPECTIONPOINT.ID%Type;--巡查表ID
- 计算天数:TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR('2022-04-19', 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss'))
案例1:
create or replace procedure IP_TASK is
--声明变量
cursor c_list is
select id ipid
from INSPECTIONPOINT i
where (EnableTime is not null
or DisableTime is not null )
and deleted=0
and (TO_CHAR(EnableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd')
or TO_CHAR(DisableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd') );
s_ipid INSPECTIONPOINT.ID%Type;--巡查表ID
s_msg VARCHAR(200);--消息
ipmodel INSPECTIONPOINT%rowtype;--巡查表
v_setcount number(10);--需要执行行数
dormodel DISABLEOPERATIONRECORD%rowtype;--记录表
v_dorcount number(10);--记录需要执行行数
s_disableheaven number(10);--停用天数
begin
--查询巡查定时未执行数据
--打开游标
open c_list;
--遍历游标
Loop
--赋值给变量
FETCH c_list
INTO s_ipid;
--退出循环条件 (通过%NOTFOUND判断是否有值,有值执行操作,没有则退出循环)
exit when c_list%NOTFOUND;
select count(1) into v_setcount from INSPECTIONPOINT where DELETED=0 and ID=s_ipid ;
if v_setcount > 0 then
--查询今天需要执行的数据
--看这条数据,启用时间和停用时间是执行那个
select * into ipmodel from INSPECTIONPOINT where DELETED=0 and ID=s_ipid ;
--停用时间不需要计算,1:添加操作记录,2修改巡查停用时间-清空
if TO_CHAR(ipmodel.DisableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd') then
--添加操作记录
insert into DISABLEOPERATIONRECORD
(CREATEDUSER,CREATETIME, LINKID, TQTYPE, MODELTYPE, DISABLEHEAVEN, ISTIMING)
values
(ipmodel.LastOperateUser,
SYSDATE,
ipmodel.id,
1,
1,
0,
1);
--清空时间
update INSPECTIONPOINT set DisableTime='',Status=2 where id=ipmodel.id;
end if;
--启用时间就需要,计算停用天数,1:添加操作记录,2修改巡查启用时间-清空
if TO_CHAR(ipmodel.EnableTime, 'yyyy-mm-dd') =TO_CHAR(SYSDATE, 'yyyy-mm-dd') then
-- 计算天数
--先看操作记录是否有停用记录
select count(1) into v_dorcount from DISABLEOPERATIONRECORD where deleted=0 and LinkId=ipmodel.id and TqType=1 ;
--没有记录,就拿更新时间,更新时间没有,就拿创建时间
if v_dorcount<=0 then
--更新时间
if ipmodel.UpdatedTime is not null then
select TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR(ipmodel.UpdatedTime, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')) into s_disableheaven from dual;
end if;
--创建时间
if ipmodel.UpdatedTime is null then
select TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR(ipmodel.CreateTime, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')) into s_disableheaven from dual;
end if;
end if;
--存在记录
if v_dorcount>0 then
select * into dormodel from ( select * from DISABLEOPERATIONRECORD where deleted=0 and LinkId=ipmodel.id and TqType=1 order by createtime desc ) where rownum = 1;
select TO_NUMBER(TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')- TO_DATE(TO_CHAR(dormodel.CreateTime, 'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss')) into s_disableheaven from dual;
end if;
--添加操作记录
insert into DISABLEOPERATIONRECORD
(CREATEDUSER,CREATETIME, LINKID, TQTYPE, MODELTYPE, DISABLEHEAVEN, ISTIMING)
values
(ipmodel.LastOperateUser,
SYSDATE,
ipmodel.id,
0,
1,
s_disableheaven,
1);
--清空时间
update INSPECTIONPOINT set EnableTime='',Status=1 where id=ipmodel.id;
end if;
end if;
end loop;
--关闭游标
close c_list;
COMMIT;
s_msg := '定时执行日常巡查停启任务';
DBMS_OUTPUT.PUT_LINE(s_msg || '成功' ||
to_char(CURRENT_DATE, 'yyyy-mm-dd'));
--异常回滚
exception
when others then
rollback;
dbms_output.put_line(s_msg || '失败' ||
to_char(CURRENT_DATE, 'yyyy-mm-dd'));
DBMS_OUTPUT.PUT_LINE(SQLERRM);
end IP_TASK;
案例2:
create or replace procedure EP_Task(e_tasktype in NUMBER) is
--声明变量
cursor c_list is
select e.id EquipId, p.id projectid
from EQUIP e
join PROJECT p
on e.projectid = p.id
where e.status = 2
and e.DELETED = 0 ;
s_equipid EQUIP.ID%Type;--设备ID
s_projectid PROJECT.Id%Type;--项目ID
s_emid EQUIPMAINTENANCEDETAIL.Emid%Type;--新增维保主表ID
s_escid EQUIPSELFCHECKDETAIL.ESID%Type;--新增自检主表ID
s_msg VARCHAR(200);--消息
v_tcount number(10);--维保次数
v_sentcount number(10);--已发送维保次数
v_escount number(10);--自检行数
v_sentescount number(10);--已发送自检行数
v_setcount number(10);--频率行数
emmodel EQUIPFREQUENCYSET%rowtype;--频率表
s_frequency number(10) ;--执行次数
s_bl number(10) ;--循环
begin
case e_tasktype
when 1 then
--创建维保任务
--打开游标
open c_list;
--遍历游标
Loop
--赋值给变量
FETCH c_list
INTO s_equipid, s_projectid;
--退出循环条件 (通过%NOTFOUND判断是否有值,有值执行操作,没有则退出循环)
exit when c_list%NOTFOUND;
select count(1) into v_setcount from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=2 and rownum = 1;
if v_setcount>0 then
select * into emmodel from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=2 and rownum = 1;
end if;
--频率任务设置存在
if v_setcount > 0 and emmodel.endtime>=SYSDATE and emmodel.begintime<=SYSDATE then
--查看次数和已发送的次数比较
select count(1) into v_sentcount from EQUIPMAINTENANCE where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid and CREATETIME>=emmodel.begintime and CREATETIME<=emmodel.endtime;
if v_sentcount<emmodel.frequency then
s_frequency:=emmodel.frequency - v_sentcount;
end if;
end if;
if v_setcount <= 0 or emmodel.endtime<SYSDATE or emmodel.begintime>SYSDATE then
--频率任务没有设置---频率任务设置过期了或者不在范围内-默认1月1次
select count(1) into v_tcount from EQUIPMAINTENANCE where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid and CREATETIME>=trunc(sysdate, 'mm') ;
if v_tcount<=0 then
s_frequency:=1;
end if;
end if;
s_bl:=0;
while s_bl < s_frequency loop s_bl:=s_bl+1;
--新增主表
insert into EQUIPMAINTENANCE
(CREATEDUSER,CREATETIME, EQUIPID, PROJECTID, BEGINTIME, ENDTIME, STATUS)
values
(1,
SYSDATE,
s_equipid,
s_projectid,
(trunc(sysdate, 'mm')+1/24),
(trunc(LAST_DAY(SYSDATE))+23/24),
1);
select "SEQ_EQUIPMAINTENANCE".currval into s_emid from dual;
for ep_row in ( select ep.id EPId from EquipPoint ep join POINTBASIS pb on ep.PointId=pb.id where ep.equipid=s_equipid and ep.Status=0 and ep.DELETED=0 and pb.PointNo != 20 and pb.PointNo != 21 )loop
--新增详情
insert into EQUIPMAINTENANCEDETAIL
(CREATEDUSER,CREATETIME, EMID, EPID)
values
(1,
to_timestamp(TO_CHAR(sys_extract_utc(systimestamp),'YYYY-MM-DD') || ' 00:00:00','yyyy-mm-dd hh24:mi:ss.ff'),
s_emid,
ep_row.epid
);
end loop;
end loop;
end loop;
--关闭游标
close c_list;
COMMIT;
s_msg := '定时创建维保任务';
DBMS_OUTPUT.PUT_LINE(s_msg || '成功' ||
to_char(CURRENT_DATE, 'yyyy-mm-dd'));
when 2 then
--创建自检任务
--打开游标
open c_list;
--遍历游标
Loop
--赋值给变量
FETCH c_list
INTO s_equipid, s_projectid;
--退出循环条件 (通过%NOTFOUND判断是否有值,有值执行操作,没有则退出循环)
exit when c_list%NOTFOUND;
select count(1) into v_setcount from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=1 and rownum = 1;
if v_setcount>0 then
select * into emmodel from EQUIPFREQUENCYSET eps where DELETED=0 and EQUIPID=s_equipid and TYPE=1 and rownum = 1;
end if;
--频率任务设置存在
if v_setcount > 0 and emmodel.endtime>=SYSDATE and emmodel.begintime<=SYSDATE then
--查看次数和已发送的次数比较
select count(1) into v_sentescount from EQUIPSELFCHECK where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid
and CREATETIME>=emmodel.begintime and CREATETIME<=emmodel.endtime and TYPE=1;
if v_sentescount<emmodel.frequency then
s_frequency:=emmodel.frequency - v_sentescount;
end if;
end if;
if v_setcount <= 0 or emmodel.endtime<SYSDATE or emmodel.begintime>SYSDATE then
--频率任务没有设置---频率任务设置过期了或者不在范围内-默认1月1次
select count(1) into v_escount from EQUIPSELFCHECK where DELETED=0 and EQUIPID=s_equipid and PROJECTID=s_projectid and CREATETIME>=trunc(sysdate, 'mm')and TYPE=1 ;
if v_tcount<=0 then
s_frequency:=1;
end if;
end if;
s_bl:=0;
while s_bl < s_frequency loop s_bl:=s_bl+1;
--新增主表
insert into EQUIPSELFCHECK
(CREATEDUSER,
CREATETIME,
EQUIPID,
PROJECTID,
BEGINTIME,
ENDTIME,
TYPE,
STATUS)
values
(1,
SYSDATE,
s_equipid,
s_projectid,
(trunc(sysdate, 'mm')+1/24),
(trunc(LAST_DAY(SYSDATE))+23/24),
1,
1);
select "SEQ_EQUIPSELFCHECK".currval into s_escid from dual;
for ep_row in ( select ep.id EPId from EquipPoint ep join POINTBASIS pb on ep.PointId=pb.id where ep.equipid=s_equipid and ep.Status=0 and ep.DELETED=0 and pb.ISSELFCHECK=1 )loop
--新增详情
insert into EQUIPSELFCHECKDETAIL
(CREATEDUSER,CREATETIME, ESID, EPID, SEVERITY, ELIGIBILITY)
values
(1,
to_timestamp(TO_CHAR(sys_extract_utc(systimestamp),'YYYY-MM-DD') || ' 00:00:00','yyyy-mm-dd hh24:mi:ss.ff'),
s_escid,
ep_row.epid,
1,
1
);
end loop;
end loop;
end loop;
--关闭游标
close c_list;
COMMIT;
s_msg := '定时创建自检任务';
DBMS_OUTPUT.PUT_LINE(s_msg || '成功' ||
to_char(CURRENT_DATE, 'yyyy-mm-dd'));
else
null;
end case;
--异常回滚
exception
when others then
rollback;
dbms_output.put_line(s_msg || '失败' ||
to_char(CURRENT_DATE, 'yyyy-mm-dd'));
DBMS_OUTPUT.PUT_LINE(SQLERRM);
end EP_Task;