job&trigger

/*JOB
问题描述:JOB的执行时间往后推迟很长时间,导致查询的数据不再时间范围内。
原因分析:
原因一:JOB执行时间间隔没有加TRUNC截取精度,而是直接使用SYSDATE+1/(24*60),由于JOB启动需要时间或扫描精度,导致下次执行时间用的标准时间已经不是启动JOB的时间,而是延迟几秒,执行一次就延迟几秒,执行次数多了延迟就长了
原因二:由于JOB执行的存储过程异常,导致JOB执行失败,查询SELECT * FROM DBA_JOBS的FAILURES字段加1,同时下次执行时间为本次执行时间+2分钟,如果再次失败,由下次执行的时间为上次开始执行时间+4 , 再次失败则+8,2的阶乘,以此类推,直到失败16次后,JOB就BROKEN了,不再尝试执行。执行成功后,FAILURES字段清0
问题处理:
原因一处理:JOB的执行时间间隔加TRUNC函数,’TRUNC(SYSDATE,”HH24”)+3/24’;’TRUNC(SYSDATE,”MI”)+30/(24*60)’);’TRUNC(SYSDATE,”MI”) + 10/(24*60)’;
原因二处理:查看执行的失败存过,处理后,重新编译
SELECT * FROM USER_JOBS;
EXECUTE DBMS_JOB.REMOVE(JOB_ID);

ORACLE SCHEDULE JOB
DECLARE
JOB1 NUMBER;
BEGIN
DBMS_JOB.SUBMIT(
JOB => JOB1, –自动生成JOB_ID
WHAT => ‘CD_WELL_SOURSE_P(NULL);’, –需要执行的存储过程名称或SQL语句
NEXT_DATE => TO_DATE(‘2018-06-28 12:00:00’,’YYYY-MM-DD HH24:MI:SS’), –初次执行时间-下一个3分钟
INTERVAL => ‘TRUNC(SYSDATE+1)+12/24’ –每天12点执行一次
);
COMMIT;
END;

/*TRIGGER触发器
SELECT * FROM ALL_TRIGGER;
CREATE [OR REPLACE] TRIGGER 触发器名 触发时间 触发事件
ON 表名
[FOR EACH ROW]
BEGIN
PL/SQL语句
END
*/

create or replace trigger trigger_01
after insert or update on f_equip_repick_det
for each row
begin
if(to_char(sysdate,’DAY’) in (‘星期一’))
then
insert into t1 (c1,c2) values(‘不是上班时间,不能插入数据’,sysdate);
–commit;
–then raise_application_error(-20001,’不是上班时间,不能插入数据’);
end if;
end;
drop trigger trigger_01;
insert into f_equip_repick_det (det_id) values(‘998’);
commit;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值