Oracle定時任務總結

在項目中遇到需要將日誌表分表中的信息做統計,並且定時寫入新表中的任務,經過學習和摸索,總結如下:
1,動態sql拼接,命令字:EXECUTE IMMEDIATE
由於分表的形式爲XXXXXX_YYYYMMDD後綴是變化的,所以要動態的變更sql語句,就使用到了這個命令字;
2,存儲過程(對敏感信息xx處理)
查詢結果中引入了一個序列

CREATE OR REPLACE PROCEDURE prcd_bs_srv_log_count  IS
BEGIN
  EXECUTE IMMEDIATE 'insert into xxxxx.Bs_Srv_Log_Count(count_id,channel_type,source_ip,flow_name,total_cnt,succ,fail
    ,fail_per,system_err,avg_elapsed,min_elapsed,max_elapsed,create_time)      
    select seq_bs_srv_log_count.nextval,all_count.* from
    (select 
           t.channel_type,t.source_ip,t.flow_name,
           count(1) total_cnt,
           sum(decode(t.ret_code,''Y'',1,0)) succ, 
           sum(decode(t.ret_code,''Y'',0,1)) fail,
           round(sum(decode(t.ret_code,''Y'',0,1))/count(1),2) fail_per,
           round(sum(decode(lengthb(t.ret_code),5,1,0))/count(1),2) system_err,
           round(avg(extract(second from(t.end_time - t.start_time)) * 1000),2) avg_elapsed,
           round(min(extract(second from(t.end_time - t.start_time)) * 1000),2) min_elapsed,
           round(max(extract(second from(t.end_time - t.start_time)) * 1000),2) max_elapsed,
           sysdate
        from xxxxxx.bs_srv_log_'||to_char(sysdate,'yyyymmdd')||' t 
        where 1=1
        and t.start_time > sysdate - 15 / 24 /60      
        group by t.channel_type,t.source_ip,t.flow_name ) all_count';
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback');
    ROLLBACK;
END; 

3,建立job定時任務

declare
    job number;
begin
    sys.dbms_job.submit(job => job,
    what => 'prcd_bs_srv_log_count;',
    next_date => SYSDATE,--立即執行
    interval => 'sysdate+15/(24*60)');--每15分鐘執行一次
    commit;
    DBMS_JOB.RUN(job);
end;


查詢job

select job
  from user_jobs 

刪除job

begin  
       dbms_job.remove('29');---job代號  
       commit;  
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章