1. 程式人生 > >Oracle定時任務Job筆記

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中也有整合介面