ORACLE定時器是靠時間去觸發JOB,而觸發器是靠事件去觸發JOB.從安全性上考慮,觸發器的安全度要高於定時器。機制也優於定時器。
-- ORACLE通過標志表實現存儲過程觸發。數據執行完畢后更新記錄。
create table TRI_ERMETL(object_name varchar2(100),data_date char(8),flag char(1),curr_time date);
insert into TRI_ERMETL values('ERMETL','20180324','N',sysdate);
CREATE OR REPLACE TRIGGER ETL_TRIGGER
AFTER INSERT ON TRI_ERMETL
DECLARE v_date date;
begin
select to_date(data_date,'yyyy-mm-dd') into v_date
from (select data_date,row_number ()over(order by curr_time desc) as rn from TRI_ERMETL
where flag ='N' and object_name='ERMETL'
) where rn=1 ;
commit;
erm_etl.main(v_date);
update TRI_ERMETL set flag='Y' where curr_time in (select max(curr_time) from TRI_ERMETL
where flag ='N' and object_name='ERMETL' and data_date=to_char(v_date,'YYYYMMDD'));
end;
--定時器
DECLARE
job_no_ NUMBER;
BEGIN
DBMS_JOB.SUBMIT(job_no_,
'ERM_ETL.MAIN(TRUNC(SYSDATE)-1);', -- 調用包,參數為當前日期前一天
sysdate,
'TRUNC(sysdate)+1+12/24'); -- 12/24 每天中午2點
COMMIT;
END;
/**
查詢JOB
select
job,last_date,last_sec,next_sec,total_time,interval,what
from user_jobs
*/