oracle job 语法

一、先看一个简单例子:

(1)创建测试表
  SQL> create table TEST(a date);
  表已创建。  
(2)创建一个自定义过程
  SQL> create or replace procedure MYPROC as
   2 begin
   3 insert into TEST values(sysdate);
   4 end;
   5 /
  
  过程已创建。
  
  创建JOB
   SQL>

            declare

                 job1 number; 

             begin
      dbms_job.submit(job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟,即一分钟运行test过程一次
      end;

    第一个参数代表job名称

    第二个参数代表要跑的存储过程名
  第三个参数sysdate表示开始执行的时间

    第四个参数表示间隔多长时间运行一次过程
  
  PL/SQL 过程已成功完成。
  
  运行JOB
  SQL> begin
              dbms_job.run(3017);
              end;   
  PL/SQL 过程已成功完成。
  
  SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from TEST;
  
  时间
  -------------------
  2001/01/07 23:51:21
  2001/01/07 23:52:22
  2001/01/07 23:53:24
  
  删除JOB
  SQL> begin
   2 dbms_job.remove(3017);
   3 end;
   4 /   
  PL/SQL 过程已成功完成.

     “3017”代表对应job字段的值

二、查看job

  1、相关视图
  dba_jobs
  all_jobs
  user_jobs
  dba_jobs_running 包含正在运行job相关信息
  2、查看相关信息
  SQL>SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN  FROM DBA_JOBS;
  
  JOB        NEXT_DATE          NEXT_SEC FAILURES B
  ------- --------- -------- -------- -
  9125       01-JUN-01 00:00:00     4           N
  14144     24-OCT-01 16:35:35     0          N
  9127       01-JUN-01 00:00:00     16         Y
  3 rows selected.
  
  正在运行的JOB相关信息
  SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SEC  FROM DBA_JOBS_RUNNING r, DBA_JOBS j  WHERE r.JOB = j.JOB;
  
  SID JOB LOG_USER THIS_DATE THIS_SEC
  ----- ---------- ------------- --------- --------
  12 14144 HR 24-OCT-94 17:21:24
  25 8536 QS 24-OCT-94 16:45:12
  2 rows selected.
   
  JOB QUEUE LOCK相关信息
  SELECT SID, TYPE, ID1, ID2  FROM V$LOCK   WHERE TYPE = 'JQ';
  
  SID TY ID1 ID2
  --------- -- --------- ---------
  12 JQ 0 14144
  1 row selected.

三、dba_job各个字段的含义

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)          任务运行的其他一些会话参数

四、时间间隔的设定

1:每分钟执行

Interval => TRUNC(sysdate,'mi') + 1/ (24*60)

2:每天定时执行

例如:每天的凌晨1点执行

Interval => TRUNC(sysdate) + 1 +1/ (24)

3:每周定时执行

例如:每周一凌晨1点执行

Interval => TRUNC(next_day(sysdate,'星期一'))+1/24

4:每月定时执行

例如:每月1日凌晨1点执行

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24

5:每季度定时执行

例如每季度的第一天凌晨1点执行

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

6:每半年定时执行

例如:每年7月1日和1月1日凌晨1点

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

7:每年定时执行

例如:每年1月1日凌晨1点执行

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

 

posted @ 2012-08-29 09:46  加勒比海盗船  阅读(356)  评论(0编辑  收藏  举报