oracle 存储过程 for loop 定时任务
记录。
是这么个事,要实现一个需求,当人员表里的数据有更新后需要告知其他系统更新他们自己的人员数据。
我想了一下,表里是有时间戳字段的,那我只要监听这个时间就行,拿到数据后用存储过程把数据插入到中间表,然后其他系统从中间表更新到他自己的系统库里面
1.先创建一张所需数据的中间表
create table t_rygx ( ryid varchar(64) primary key not null , bm varchar(64), jh varchar(64), gh varchar(64), xm varchar(64), sfzh varchar(64), zzjgid varchar(64), zzjgbm varchar(64), zzjgmc varchar(200),
zt number , gxsj date DEFAULT CURRENT_TIMESTAMP, cjsj date DEFAULT CURRENT_TIMESTAMP )
2.创建存储过程
create or replace procedure insert_ry is --让游标变量指向一个动态select查询的结果集 cursor v_rys is select ry.ryid, ry.bm, ry.xm, ry.jh, ry.gh, ry.sfzh, zzjg.zzjgid, zzjg.bm as zzjgbm, zzjg.mc as zzjgmc from t_ry ry left join t_zzjgcy cy on ry.ryid = cy.ryid left join t_zzjg zzjg on cy.zzjgid = zzjg.zzjgid where ry.sfyx = 1 and ry.gxsj > sysdate + ( 10 /24 /60); --当前时间减十分钟 extis integer;--声明变量值 begin --循环开始 for e in v_rys loop select count(1) into extis from t_rygx where ryid = e.ryid; if extis < 1 then INSERT INTO t_tyqx_rygx ( ryid, xm, bm, jh, gh, sfzh, zzjgid, zzjgbm, zzjgmc, zt, cjsj, gxsj ) VALUES ( e.ryid, e.xm, e.bm, e.jh, e.gh, e.sfzh, e.zzjgid, e.zzjgbm, e.zzjgmc,
0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP ); else update t_rygx set xm = e.xm, bm = e.bm, jh = e.jh, gh = e.gh, sfzh = e.sfzh, zzjgid = e.zzjgid, zzjgbm = e.zzjgbm, zzjgmc = e.zzjgmc
zt = 0 ,
where ryid = e.ryid ;
end if; --if结束 end loop; --循环结束 end;
3.创建job定时任务
declare job number ; begin dbms_job.submit( job, --返回的定时器id,不用管 'insert_ry;', -- 要执行的存储过程 sysdate, --立即生效 'TRUNC(sysdate,''mi'') + 10/ (24 * 60)' --定时时效 每十分钟执行一次,其他时间自行搜索 ); commit; end;
4.上面三步完成就弄完了 ,然后就可以去看下数据了
select * from t_rygx
5.补充一些定时任务相关的内容
四个参数说明:
job:输出变量,是此任务在任务队列中的编号;
what:执行的任务的名称及其输入参数;
next_date:任务执行的时间;
interval:任务执行的时间间隔。
-- 查看调度任务 select * from user_jobs; -- 查看正在执行的调度任务 select * from dba_jobs_running; -- 查看执行完的调度任务 select * from dba_jobs;
-- 执行定时任务 BEGIN DBMS_JOB.RUN(jobid); COMMIT; END;
-- 停止已启动的定时任务 BEGIN DBMS_JOB.BROKEN(25, TRUE, SYSDATE); COMMIT; END;
-- 删除指定job BEGIN DBMS_JOB.REMOVE(25); commit; END;
5.常用INTERVAL 参数值
描述 INTERVAL参数值 每天午夜12点 TRUNC(SYSDATE + 1) 每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60) 每星期二中午12点 NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24 每个月第一天的午夜12点 TRUNC(LAST_DAY(SYSDATE ) + 1) 每个季度最后一天的晚上11点 TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24 每星期六和日早上6点10分 TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60) 每秒钟执行次 Interval => sysdate + 1/(24 * 60 * 60) 如果改成sysdate + 10/(24 * 60 * 60)就是10秒钟执行次 每分钟执行 Interval => TRUNC(sysdate,'mi') + 1/ (24*60) 如果改成TRUNC(sysdate,'mi') + 10/ (24*60) 就是每10分钟执行次 每天定时执行 例如:每天的凌晨1点执行 Interval => TRUNC(sysdate) + 1 +1/ (24) 每周定时执行 例如:每周一凌晨1点执行 Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 每月定时执行 例如:每月1日凌晨1点执行 Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 每季度定时执行 例如每季度的第一天凌晨1点执行 Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 每半年定时执行 例如:每年7月1日和1月1日凌晨1点 Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 每年定时执行 例如:每年1月1日凌晨1点执行 Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24