如何使用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时要注意,作业不能调用作业,作业描述中的单引要用双单引替换







一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值