PL/SQL:學會使用DBMS_JOB包

 一、DBMS_JOB包的使用
    DBMS_JOB包用於安排和管理作業隊列.通過使用作業,可以使ORACLE數據庫定期執行特定的任務.
    注意:使用DBMS_JOB管理作業時,必須確保設置初始化參數JOB_QUEUE_PROCESSES(不能爲0)
  1.SUBMIT
    該過程用於建立一個新作業,當建立作業時,需要給出作業要執行的操作,作業的下次運行日期及時間間隔.
    語法:
    DBMS_JOB.SUBMIT(
     job OUT BINARY_INTEGER,
     what IN VARCHAR2,
     next_date IN DATE DEFAULT sysdate,
     interval  IN VARCHAR2 DEFAULT 'null',
     no_parse  IN BOOLEAN DEFAULT FALSE,
     instance  IN BINARY_INTEGER DEFAULT any_instance,
     force     IN BOOLEAN DEFAULT FALSE);
    如上所示,job用於指定作業編號;what用於指定作業要執行的操作;next_date用於指定作業的下次運行日期;
 interval用於指定運行作業的時間間隔;no_parse用於指定是否解析與作業相關的過程;instance用於指定哪個
 例程可以運行作業;force用於指定是否強制運行與作業相關的例程,下面以建立用於分析scott.emp表的作業爲
 例,說明建立作業的方法.示例如下:
var jobno number
begin
    dbms_job.submit(
    :jobno,
    'dbms_ddl.analyze_object(''table'',''scott'',''emp'',''compute'');',
     sysdate,
    'sysdate+1');
    commit;
end;
/
jobno
---------
21
以上建立了一個作業,作業號爲:21,下面可以進行調用此作業號,運行;

   2.REMOVE
   該過程用於刪除作業隊列中的特定作業,語法如下:
     DBMS_JOB.REMOVE (job IN BINARY_INTEGER);
   下面以刪除作業21爲例,說明使用該過程的方法.如下:
     DBMS_JOB.REMOVE(21);
   3.CHANGE
   該過程用於改變與作業相關的所有信息,包括作業操作,作業運行日期以及運行時間間隔等)語法如下:
     DBMS_JOB.CHANGE(
       job IN BINARY_INTEGER,what IN VARCHAR2,
       next_date IN DATE,interval IN VARCHAR2,
       instance  IN BINARY_INTEGER DEFAULT null,
       force IN BOOLEAN DEFAULT FALSE);
   下面以改變作業的
    exec DBMS_JOB.CHANGE(21,null,null,'SYSDATE+2')
   4.WHAT
   該過程用於改變作業要執行的操作,語法如下:
    DBMS_JOB.WHAT(job IN BINARY_INTEGER,what IN VARCHAR2);
   下面以改變作業21的運行操作爲例:
    exec dbms_job.what(21,'dbms_stats.gather_table_stats(''scott'',''EMP'');');
   5,NEXT_DATE
   該過程用於改變作業的下次運行日期.語法如下:
      DBMS_JOB.NEXT_DATE (job IN BINARY_INTEGER,next_date IN DATE);
   下面以改變作業21的下次運行日期爲例.
      DBMS_JOB.NEXT_DATE(21,'SYSDATE+1');
   6.INSTANCE
   該過程用於改變運行作業的例程,語法如下:
      DBMS_JOB.INSTANCE (
       job IN BINARY_INTEGER,
       instance IN BINARY_INTEGER,
       force IN BOOLEAN DEFAULT FALSE);
   實例:
      DBMS_JOB.INSTANCE(21,1)
   7.INTERVAL
    該過程用於改變作業的運行時間間隔.語法如下:
      DBMS_JOB.INTERVAL(job in BINARY_INTEGER,interval IN VARCHAR2);
    實例:
     exec  DBMS_JOB.INTERVAL(21,'SYSDATE+1/24/60');
   8.BROKEN
     該過程用於設置作業的中斷標記,當中斷了作業之後.作業將不會被運行.語法如下:
     DBMS_JOB.BROKEN(
     job IN BINARY_INTEGER,broken IN BOOLEAN,
     next_date IN DATE DEFAULT SYSDATE);
   實例:
     exec DBMS_JOB.BROKEN(21,TRUE,'sysdate+1')
   9.RUN
    該過程用於運行已存在的作業.語法如下
     DBMS_JOB.RUN(job iN BINARY_INTEGER,force IN BOOLEAN dEFAULT FALSE);
    實例:
     DBMS_JOB.RUN(21);
   10.作業使用示例:
     當在ORACLE 數據庫中使用作業時,應該首先使用過程SUBMIT來建立作業,然後使用過程RUN來運行作業.
   下面以每天蒐集SCOTT方案的所有對應統計爲例.說明在ORACLE數據庫中使用作業的方法.
    a. 創建一個表

SQL> create table T(a date);

    b. 創建一個自定義過程
SQL>create or replace procedure p_t_insert is
         begin
         insert into t values(sysdate);
         end;
         /
    c.創建JOB

SQL> variable job number;
SQL> exec DBMS_JOB.SUBMIT(:job,'p_t_insert;',sysdate,'sysdate+1/1440');--每天1440分鐘,即一分鐘運行p_t_insert過程一次
SQL> exec DBMS_JOB.RUN(:job);
SQL> select to_char(d,'yyyy/mm/dd hh24:mi:ss') 時間 from T;
時間
-------------------
2013/01/20 16:49:17
2013/01/20 16:50:19
2013/01/20 16:51:24
2013/01/20 16:52:29
2013/01/20 16:53:34

    d.禁止作業運行

SQL>exec DBMS_JOB.BROKEN(:job,ture);

    e.刪除作業

SQL>exec DBMS_JOB.REMOVE(:job);

    f.job change//修改作業
SQL>execute dbms_job.change(:job,null,null,'sysdate+3');
SQL>execute dbms_job.change(:job,'scott.test(update)');
     COMMIT;請記得一定要提交;

二、作業的管理

  1.顯示當前使用所有作業:

   select job, what, next_date, next_sec, sysdate, failures, broken,interval  from user_jobs a;

   相關視圖:dba_jobs、all_jobs、user_jobs、dba_jobs_running 包含正在運行job相關信息
  2.初始化相關參數job_queue_processes
     alter system set job_queue_processes=39 scope=spfile;//最大值不能超過1000 ;job_queue_interval = 10 //調度作業刷新頻率秒爲單位
     DBA_JOBS describes all jobs in the database.
     USER_JOBS describes all jobs owned by the current user

  3.查詢job的情況。
     show paramter background_dump_dest.
    看alter.log 和trace

  4.停其他用戶的job
    SQL>exec sys.dbms_ijob.broken(21,true);  --true停止,false打開
    SQL>commit;


   描述                      INTERVAL參數值                                                         
每天1440分鐘,即一分鐘運行 sysdate+1/1440
每天午夜12點              'TRUNC(SYSDATE + 1)'
每天早上8點30分          'TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'
每星期二中午12點          'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每個月第一天的午夜12點      'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每個季度最後一天的晚上11點 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6點10分      'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)'

DBA_JOBS 表內容 

字段(列)            類型                         描述
JOB                    NUMBER               任務的唯一標示號
LOG_USER         VARCHAR2(30)      提交任務的用戶
PRIV_USER        VARCHAR2(30)      賦予任務權限的用戶
SCHEMA_USER  VARCHAR2(30)      對任務作語法分析的用戶模式
LAST_DATE         DATE                    最後一次成功運行任務的時間
LAST_SEC          VARCHAR2(8)        如HH24:MM:SS格式的last_date日期的小時,分鐘和秒
THIS_DATE          DATE                    正在運行任務的開始時間,如果沒有運行任務則爲null
THIS_SEC           VARCHAR2(8)        如HH24:MM:SS格式的this_date日期的小時,分鐘和秒
NEXT_DATE         DATE                    下一次定時運行任務的時間
NEXT_SEC          VARCHAR2(8)        如HH24:MM:SS格式的next_date日期的小時,分鐘和秒
TOTAL_TIME        NUMBER              該任務運行所需要的總時間,單位爲秒
BROKEN             VARCHAR2(1)        標誌參數,Y標示任務中斷,以後不會運行
INTERVAL           VARCHAR2(200)    用於計算下一運行時間的表達式
FAILURES           NUMBER               任務運行連續沒有成功的次數
WHAT                 VARCHAR2(2000)   執行任務的PL/SQL塊
CURRENT_SESSION_LABEL RAW  MLSLABEL      該任務的信任Oracle會話符
CLEARANCE_HI      RAW MLSLABEL     該任務可信任的Oracle最大間隙
CLEARANCE_LO      RAW                  MLSLABEL 該任務可信任的Oracle最小間隙
NLS_ENV           VARCHAR2(2000)     任務運行的NLS會話設置
MISC_ENV          RAW(32)                 任務運行的其他一些會話參數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章