在項目中遇到需要將日誌表分表中的信息做統計,並且定時寫入新表中的任務,經過學習和摸索,總結如下:
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;