如何使用dbms_job系统包管理job

Oracle为我们提供了一个包,可以用来管理和维护job,下面来做一些相关的测试


通常,一个job有四要素:
jobno 作业号:系统自动产生
what 做什么:由用户来指定,以分号分隔语句,可以是存储过程.
when 什么时间开始做:日期类型
interval 作业的间隔时间:字符型



ZLM@ora10g> create table t1 as select * from scott.emp;


Table created.


ZLM@ora10g> select * from t1;


     EMPNO ENAME      JOB       MGR HIREDATE SAL   COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK      7902 17-12月-80 800 20
      7499 ALLEN      SALESMAN      7698 20-2月 -81 1600    300 30
      7521 WARD       SALESMAN      7698 22-2月 -81 1250    500 30
      7566 JONES      MANAGER      7839 02-4月 -81 2975 20
      7654 MARTIN     SALESMAN      7698 28-9月 -81 1250   1400 30
      7698 BLAKE      MANAGER      7839 01-5月 -81 2850 30
      7782 CLARK      MANAGER      7839 09-6月 -81 2450 10
      7788 SCOTT      ANALYST      7566 19-4月 -87 3000 20
      7839 KING       PRESIDENT   17-11月-81 5000 10
      7844 TURNER     SALESMAN      7698 08-9月 -81 1500      0 30
      7876 ADAMS      CLERK      7788 23-5月 -87 1100 20
      7900 JAMES      CLERK      7698 03-12月-81 950 30
      7902 FORD       ANALYST      7566 03-12月-81 3000 20
      7934 MILLER     CLERK      7782 23-1月 -82 1300 10


14 rows selected.


--提交一个作业
ZLM@ora10g> VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno,'update zlm.t1 set sal=sal+1;',SYSDATE , 'SYSDATE + 1/24/60');
COMMIT;
END;
/


PL/SQL procedure successfully completed.


以上job表示从当前时间开始,每分钟自动将t1表中sal字段值递增1


ZLM@ora10g> col what for a80
ZLM@ora10g> select JOB,WHAT from dba_jobs;


       JOB WHAT
---------- --------------------------------------------------------------------------------
1 EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
21 update zlm.t1 set sal=sal+1;


jobno为1的是系统自动运行的job,而jobno为21的这个,就是刚才命令指定的job执行的内容了


ZLM@ora10g> set time on;
14:27:51 ZLM@ora10g> select * from t1;


     EMPNO ENAME      JOB       MGR HIREDATE SAL   COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK      7902 17-12月-80 802 20
      7499 ALLEN      SALESMAN      7698 20-2月 -81 1602    300 30
      7521 WARD       SALESMAN      7698 22-2月 -81 1252    500 30
      7566 JONES      MANAGER      7839 02-4月 -81 2977 20
      7654 MARTIN     SALESMAN      7698 28-9月 -81 1252   1400 30
      7698 BLAKE      MANAGER      7839 01-5月 -81 2852 30
      7782 CLARK      MANAGER      7839 09-6月 -81 2452 10
      7788 SCOTT      ANALYST      7566 19-4月 -87 3002 20
      7839 KING       PRESIDENT   17-11月-81 5002 10
      7844 TURNER     SALESMAN      7698 08-9月 -81 1502      0 30
      7876 ADAMS      CLERK      7788 23-5月 -87 1102 20
      7900 JAMES      CLERK      7698 03-12月-81 952 30
      7902 FORD       ANALYST      7566 03-12月-81 3002 20
      7934 MILLER     CLERK      7782 23-1月 -82 1302 10


14 rows selected.


14:31:05 ZLM@ora10g> select * from t1;


     EMPNO ENAME      JOB       MGR HIREDATE SAL   COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7369 SMITH      CLERK      7902 17-12月-80 806 20
      7499 ALLEN      SALESMAN      7698 20-2月 -81 1606    300 30
      7521 WARD       SALESMAN      7698 22-2月 -81 1256    500 30
      7566 JONES      MANAGER      7839 02-4月 -81 2981 20
      7654 MARTIN     SALESMAN      7698 28-9月 -81 1256   1400 30
      7698 BLAKE      MANAGER      7839 01-5月 -81 2856 30
      7782 CLARK      MANAGER      7839 09-6月 -81 2456 10
      7788 SCOTT      ANALYST      7566 19-4月 -87 3006 20
      7839 KING       PRESIDENT   17-11月-81 5006 10
      7844 TURNER     SALESMAN      7698 08-9月 -81 1506      0 30
      7876 ADAMS      CLERK      7788 23-5月 -87 1106 20
      7900 JAMES      CLERK      7698 03-12月-81 956 30
      7902 FORD       ANALYST      7566 03-12月-81 3006 20
      7934 MILLER     CLERK      7782 23-1月 -82 1306 10


14 rows selected.


可以看到,在4分钟内,sal字段的值已经从2递增到了6


--删除作业
14:31:14 ZLM@ora10g> exec dbms_job.remove(21);


PL/SQL procedure successfully completed.


根据dba_jobs视图中job字段查到的jobno,通过dbms_job包的remove过程,就可以将对应的任务删除


14:32:38 ZLM@ora10g> set time off;
ZLM@ora10g> select job,what from dba_jobs;


       JOB WHAT
---------- --------------------------------------------------------------------------------
1 EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();
 
此时,我们自定义的那个job已经不见了


--查看后台进程
ZLM@ora10g> col error clear
ZLM@ora10g> select * from v$bgprocess where paddr<>'00';


PADDR   PSERIAL# NAME  DESCRIPTION ERROR
-------- ---------- ----- ---------------------------------------------------------------- ----------
3F216830  1 PMON  process cleanup    0
3F216DE4  1 PSP0  process spawner 0    0
3F217398  1 MMAN  Memory Manager    0
3F21794C  1 DBW0  db writer process 0    0
3F21B808  1 ARC0  Archival Process 0    0
3F21BDBC  1 ARC1  Archival Process 1    0
3F21C370  1 ARC2  Archival Process 2  448
3F217F00  1 LGWR  Redo etc.    0
3F2184B4  1 CKPT  checkpoint    0
3F218A68  1 SMON  System Monitor Process    0
3F21901C  1 RECO  distributed recovery    0
3F2195D0  1 CJQ0  Job Queue Coordinator    0
3F21C924  1 QMNC  AQ Coordinator    0
3F219B84  1 MMON  Manageability Monitor Process    0
3F21A138  1 MMNL  Manageability Monitor Process 2    0


15 rows selected.


注意,这里的CJQ0(Job Queue Coordinator) 就是作业队列调度后台进程
另外,同时最大的作业数是由JOB_QUEUE_PROCESSES这个参数来定义的


ZLM@ora10g> show parameter JOB_QUEUE_PROCESSES


NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes     integer 10


10g中,这个值默认就是10,如果该值为0,那么不会有任何job被调度


--把刚才的作业重新再提交一次
ZLM@ora10g> VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno,'update zlm.t1 set sal=sal+1;',SYSDATE , 'SYSDATE + 1/24/60');
COMMIT;
END;
/


--验证作业
ZLM@ora10g> print jobno


     JOBNO
----------
22


ZLM@ora10g> select JOB,WHAT,LAST_DATE,NEXT_DATE from dba_jobs;


       JOB WHAT    LAST_DATE   NEXT_DATE
---------- -------------------------------------------------------------------------------- -------------- --------------
1 EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();    31-3月 -15   31-3月 -15
22 update zlm.t1 set sal=sal+1;   31-3月 -15   31-3月 -15

jobno已经递增了1,从刚才的21变为22,因为这个作业号是由sys.jobseq这个序列产生,步进为1


ZLM@ora10g> col sequence_owner for a10
ZLM@ora10g> col sequence_name for a10
ZLM@ora10g> select * from dba_sequences where SEQUENCE_NAME='JOBSEQ';


SEQUENCE_O SEQUENCE_N  MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
---------- ---------- ---------- ---------- ------------ - - ---------- -----------
SYS   JOBSEQ       1  999999999       1 Y N     20 41


ZLM@ora10g> select * from DBA_JOBS_RUNNING;


no rows selected


DBA_JOBS_RUNNING这个视图,只有在当前有job正在运行的时候,才会有值,由于我创建的job很简单,运行一瞬间就能完成,因此基本都会返回没有记录


--修改作业调度时间
ZLM@ora10g> col what for a70
ZLM@ora10g> col interval  for a30
ZLM@ora10g> select JOB,WHAT,INTERVAL from dba_jobs;


       JOB WHAT  INTERVAL
---------- ---------------------------------------------------------------------- ------------------------------
1 EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();  sysdate + 1 / (24 * 60)
22 update zlm.t1 set sal=sal+1;  SYSDATE + 1/24/60

ZLM@ora10g> BEGIN
DBMS_JOB.CHANGE(22, NULL, NULL, 'SYSDATE+5/24/60');
END;
/


PL/SQL procedure successfully completed.


ZLM@ora10g> select JOB,WHAT,INTERVAL from dba_jobs;


       JOB WHAT  INTERVAL
---------- ---------------------------------------------------------------------- ------------------------------
1 EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();  sysdate + 1 / (24 * 60)
22 update zlm.t1 set sal=sal+1;  SYSDATE+5/24/60


job调度时间由每分钟运行一次改为,每5分钟运行一次


--修改下次启用时间
ZLM@ora10g> BEGIN
DBMS_JOB.NEXT_DATE(22, SYSDATE + 1);
END;
/


PL/SQL procedure successfully completed.


ZLM@ora10g> select job,what,next_date from dba_jobs;


       JOB WHAT  NEXT_DATE
---------- ---------------------------------------------------------------------- --------------
1 EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS();  31-3月 -15
22 update zlm.t1 set sal=sal+1;  01-4月 -15

表示从第2天开始运行


--修改作业运行后不再启用
ZLM@ora10g> BEGIN
DBMS_JOB.INTERVAL(22, 'NULL');
END;
/


PL/SQL procedure successfully completed.

ZLM@ora10g> select * from dba_jobs_running;


       SID  JOB FAILURES LAST_DATE LAST_SEC THIS_DATE THIS_SEC   INSTANCE
---------- ---------- ---------- -------------- ---------------- -------------- ---------------- ----------
       143   22       0 31-3月 -15 23:47:09  0


默认就是从sysdate当前时间开始运行,且只会运行一次,此时查看dba_jobs_running视图,发现是有值的,并且job之后不会再运行了
  
--修改作业的内容
ZLM@ora10g> BEGIN
DBMS_JOB.WHAT(22,'update zlm.t1 set sal=sal+1;update zlm.t1 set sal=sal-2;');
end;
/


PL/SQL procedure successfully completed.


--直接运行作业
ZLM@ora10g> BEGIN
DBMS_JOB.RUN(22);
END;
/


PL/SQL procedure successfully completed.


--中断作业
ZLM@ora10g> BEGIN
DBMS_JOB.BROKEN(22, TRUE);
END;
/


PL/SQL procedure successfully completed.


--重新启用作业
ZLM@ora10g> BEGIN
DBMS_JOB.BROKEN(22, FALSE, SYSDATE);
END;
/


PL/SQL procedure successfully completed.


在使用dbms_job时要注意,作业不能调用作业,作业描述中的单引要用双单引替换







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值