Oracle定時任務Job筆記
定時任務應用場景:
某一個生產系統上面,臨時表不斷變多,佔了不少磁碟空間。由於這套軟體是直接買的,不方便修改原始碼。所以考慮使用Oracle定時任務直接從資料庫層刪除臨時表。
定時任務業務:
首先寫好一個儲存過程。讀當前使用者所有以tempXXXXX開頭的臨時表,然後依次刪除所有的臨時表。然後在建立Oracle Job每天晚上定時呼叫這個儲存過程。
儲存過程程式碼:
create or replace PROCEDURE KDDROPTEMPTABLE AS BEGIN declare cursor c_usertable is select table_name from user_tables t where t.TABLE_NAME like 'TEMPTABLE0000%' and status = 'VALID'; my_tablename user_tables.table_name%TYPE; v_sql varchar2(200); v_count integer := 0; begin --DBMS_OUTPUT.ENABLE(buffer_size => null); open c_usertable; loop --提取一行資料到c_usertable fetch c_usertable into my_tablename; exit when c_usertable%notfound; v_sql := 'drop table '||my_tablename; execute immediate v_sql; v_count := v_count+1; -- dbms_output.put_line(v_sql); end loop; --關閉遊標 close c_usertable; dbms_output.put_line('總工刪除的臨時表數量:'||v_count); end;END KDDROPTEMPTABLE;
Oracle定時任務建立步驟
Oracle有兩種語法可以建定時任務,目前建議的是下面這種。老的方式已經不在建議使用。
如果你有Oracle SQL developer可以用介面新建
以下是通過SQL直接建Job:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => '"ZSNC57"."autoDeleteTemp"', job_type => 'STORED_PROCEDURE', job_action => 'ZSNC57.KDDROPTEMPTABLE', number_of_arguments => 0, start_date => TO_TIMESTAMP_TZ('2018-09-12 14:41:09.000000000 ASIA/SHANGHAI','YYYY-MM-DD HH24:MI:SS.FF TZR'), repeat_interval => 'FREQ=DAILY;BYHOUR=14;BYMINUTE=45;BYSECOND=0', end_date => NULL, enabled => FALSE, auto_drop => TRUE, comments => '自動刪除臨時表'); DBMS_SCHEDULER.SET_ATTRIBUTE( name => '"ZSNC57"."autoDeleteTemp"', attribute => 'restartable', value => TRUE); DBMS_SCHEDULER.SET_ATTRIBUTE( name => '"ZSNC57"."autoDeleteTemp"', attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_FULL); DBMS_SCHEDULER.enable( name => '"ZSNC57"."autoDeleteTemp"');END;
直接執行定時任務的方式:begin dbms_scheduler.run_job('autoDeleteTemp',TRUE); -- true代表同步執行end;
注:如果直接執行Job可以執行,但定時定時執行卻執行不了,很有可能是下面的語句沒有執行:
grant create job to 使用者名稱; alter system set job_queue_processes = 1;
如果你的Job正常運行了,通過如下幾張表可以查詢到執行記錄:
--Oracle定時任務-- job資訊select * from user_scheduler_jobs; -- job日誌select * from User_Scheduler_Job_Log;-- job執行日誌select * from user_scheduler_job_run_details;--正在執行的jobselect * from user_scheduler_running_jobs;
在Oracle SQL developer中也有整合介面