`

创建ORACLE JOB和语法

阅读更多
    http://www.cnblogs.com/conqueror/archive/2010/10/10/1847085.html
oracle job简介
主要的使用情景
定时在后台执行相关操作:如每天晚上0点将一张表的数据保存到另一张表中,2:定时备份数据库等
一、
熟化说万事开头难,这里我只简单记述一个创建一个简单的job
步骤如下:
1、创建一张表g_test
create table G_TEST
(
ID     NUMBER(12),
C_DATE DATE
)
2、创建一个sequence
create sequence G_SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with 141
increment by 1
cache 20;

3、创建一个存储过程
create or replace procedure prc_g_test is
begin
insert into g_test values(g_seq.nextval,sysdate);
end prc_g_test;

4、创建job,
使用Submit()过程,工作被正常地计划好。
这个过程有五个参数:job、what、next_date、interval与no_parse。

PROCEDURE Submit ( job       OUT binary_ineger,
What      IN  varchar2,
next_date IN  date,
interval  IN  varchar2,
no_parse  IN  booean:=FALSE)

job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。
what参数是将被执行的PL/SQL代码块。
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE
指示此PL/SQL代码在它第一次执行时应进行语法分析,
而FALSE指示本PL/SQL代码应立即进行语法分析。

在command window窗口中执行下面脚本
variable job1 number;
begin
sys.dbms_job.submit(job => :job,
what => 'prc_g_test;',
next_date => to_date('22-10-2008 10:06:41', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次
commit;
end;
/

----------------------------------------------------------------------------------
在plSQL中我的做法是:

declare 
job number;    
begin
sys.dbms_job.submit(job,'prc_g_test;',sysdate,'sysdate+1/1440');
end;
----------------------------------------------------------------------------------

5、查看创建的job
查看相关job信息
1、相关视图
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在运行job相关信息。
如:
select * from dba_jobs

6、运行JOB
说明:Run()过程用来立即执行一个指定的工作。这个过程只接收一个参数:
SQL> begin
2  dbms_job.run(:job);
3  end;
4  /

----------------------------------------------------------------------------------
在plSQL中我的做法是:
begin
dbms_job.run(3017);
end;
----------------------------------------------------------------------------------

7、删除JOB
SQL> begin
2  dbms_job.remove(:job);--:job可以用dba_jobs.job的值代替如:1198
3  end;
4  /


说明:在sqlplus命令行直接定义变量要variable!!!!


二、Oracle Job 语法
初始化相关参数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大值不能超过1000 ;job_queue_interval = 10 //调度作业刷新频率秒为单位

job_queue_process 表示oracle能够并发的job的数量,可以通过语句  
show parameter job_queue_process;
来查看oracle中job_queue_process的值。当job_queue_process值为0时表示全部停止oracle的job,可以通过语句

ALTER SYSTEM SET job_queue_processes = 10;

来调整启动oracle的job。

相关视图:
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在运行job相关信息

-------------------------
提交job语法:

begin
sys.dbms_job.submit(job => :job,
                      what => 'P_CLEAR_PACKBAL;',
                      next_date => to_date('04-08-2008 05:44:09', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'sysdate+ 1/360');
commit;
end;
/
-------------------------
创建JOB
variable jobno number;
begin
dbms_job.submit(:jobno, 'P_CRED_PLAN;',SYSDATE,'SYSDATE+1/2880',TRUE);
commit;

运行JOB
SQL> begin
         dbms_job.run(:job1);
         end;
         /

删除JOB
SQL> begin
        dbms_job.remove(:job1);
        end;
        /

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

--------------------------
描述                    INTERVAL参数值
每天午夜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)'

--------------------------

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

8、JOB不运行的检查步骤:
ORACLE有一种定时调度机制,用dbms_job包来管理。
  设置的JOB就是不运行,搞得的郁闷,
  最好执行了这个才搞定 exec dbms_ijob.set_enabled(true);
  下面提供一个checklist用于检查job异常的原因:

  1) Instance in RESTRICTED SESSIONS mode?

  Check if the instance is in restricted sessions mode:

  select instance_name,logins from v$instance;

  If logins=RESTRICTED, then:

  alter system disable restricted session;

  ^– Checked!

  2) JOB_QUEUE_PROCESSES=0

  Make sure that job_queue_processes is > 0

  show parameter job_queue_processes

  ^– Checked!

  3) _SYSTEM_TRIG_ENABLED=FALSE

  Check if _system_enabled_trigger=false

 col parameter format a25

  col value format a15

  select a.ksppinm parameter,b.ksppstvl value from x$ksppi a,x$ksppcv b

  where a.indx=b.indx and ksppinm=’_system_trig_enabled’;

  If _system_trig_enabled=false, then

  alter system set “_system_trig_enabled”=TRUE scope=both;

  ^– Checked!

  4) Is the job BROKEN?

  select job,broken from dba_jobs where job=<job_number>;

  If broken, then check the alert log and trace files to diagnose the issue.

  ^– Checked! The job is not broken.

  5) Is the job COMMITted?

  Make sure a commit is issued after submitting the job:

BEGIN

  SYS.DBMS_JOB.SUBMIT

  (

  job => X

  ,what => ‘dbms_utility.analyze_schema

  (”SCOTT”,”COMPUTE”,NULL,NULL,NULL);’

  ,next_date => to_date(’08/06/2005 09:35:00′,’dd/mm/yyyy hh24:mi:ss’)

  ,no_parse => FALSE

  );

  COMMIT;

  END;

  /

  If the job executes fine if forced (i.e., exec dbms_jobs.run(<job_no>);), then likely a commit

  is missing.

  ^– Checked! The job is committed after submission.

  6) UPTIME > 497 days

  Check if the server (machine) has been up for more than 497 days:

  For SUN, use ‘uptime’ OS command.

  If uptime>497 and the jobs do not execute automatically, then you are hitting unpublished bug 3427424

  (Jobs may stop running after 497 days uptime) which is fixed in 9206 and A102

  ^– Checked! The server in this case has been up 126 days only

  7) DBA_JOBS_RUNNING

  Check dba_jobs_running to see if the job is still running:

  select * from dba_jobs_running;

  ^– Checked! The job is not running.

  LAST_DATE and NEXT_DATE

  Check if the last_date and next_date for the job are proper:

  select Job,Next_date,Last_date from dba_jobs where job=<job_number>;

^– NEXT_DATE is porper, however LAST_DATE is null since the job never executes automatically.

9) NEXT_DATE and INTERVAL

  Check if the Next_date is changing properly as per the interval set in dba_jobs:

  select Job,Interval,Next_date,Last_date from dba_jobs where job=<job_number>;

  ^– This is not possible since the job never gets executed automatically.

  10) Toggle value for JOB_QUEUE_PROCESSES

  Stop and restart CJQ process(es)

  alter system set job_queue_processes=0 ;

  –<Wait for some time to ensure CJQ process stopped>

  alter system set job_queue_processes=4 ;

  Ref: Bug 2649244 (fixed by: 9015, 9203, 10201)

  ^– Done but did not help

  11) DBMS_IJOB(Non-documented):

  Last ditch effort.

  Either restart the database or try the following:

  exec dbms_ijob.set_enabled(true);

  Ref: Bug 3505718 (Closed, Not a Bug)

  Done but did not help

  These are the most common causes for this behavior.

  Solution

  The solution ended up to be the server (machine) uptime.

  Even though it was up for only 126 days, after the server was rebooted all jobs were able to execute automatically.

  To implement the solution, please execute the following steps:

  1. Shutdown all applications, including databases.

  2. Shutdown the server (machine)

  3. Restart all applications, including databases.

  4. Check that jobs are executing automatically.

  from metalink docs : 313102.1
分享到:
评论

相关推荐

    Oracle Job 语法和时间间隔的设定.htm

    Oracle Job 语法和时间间隔的设定

    Oracle Job定时任务

    Oracle Job 定时任务 Oracle Job 定时任务是 Oracle 数据库中的一种定时执行任务的机制,它允许用户在指定的...Oracle Job 定时任务提供了一个强大的机制来执行定时任务,可以根据不同的时间间隔和执行频率来设置。

    oracle job使用详解

    Oracle Job 的使用对于实现定时任务、批处理操作和维护工作至关重要。以下是对 Oracle Job 使用的详细解释: 1. **创建 Job**: 创建 Job 可以通过 `DBMS_JOB.SUBMIT` 存储过程完成。例如,在提供的代码中,创建了...

    oracle job 创建

    对于初学者来说,理解如何创建、运行和管理 Oracle Job 是十分重要的。 1. **Job 的创建**: 创建一个 Oracle Job 需要使用 `DBMS_JOB` 包中的 `SUBMIT` 子程序。在提供的示例中,我们看到以下步骤: - 首先,...

    xxl-job oracle 适配版本

    1. **数据库表结构**:XXL-JOB原有的MySQL表结构可能需要进行调整以适应Oracle的语法和特性。例如,表字段的数据类型、主键策略、索引创建等可能需要相应修改。 2. **SQL语句优化**:Oracle数据库有自己的SQL语法...

    oracle_job的创建更改及删除

    "Oracle Job 创建、更改和删除" Oracle Job 是一种自动执行任务的机制,允许数据库管理员创建、更改和删除作业以实现自动执行任务。本文将对 Oracle Job 的创建、更改和删除进行详细的介绍。 创建作业 创建作业...

    oracle基本语法练习

    ### Oracle基本语法练习知识点 ...通过以上练习,不仅可以掌握Oracle的基本查询语法,还能深入理解如何使用各种函数、子查询以及复杂的排序和筛选条件,从而提升在实际工作中处理复杂数据查询的能力。

    oracle中的job的用法

    Job的创建和管理主要依赖于`DBMS_JOB`包。它包含多个子过程,如Broken、change、Interval、Submit、Run、Remove、What等,每个子过程用于执行特定的任务: - Broken过程用于更新一个已提交的工作的状态,可以将一个...

    Oracle中job的使用详解

    Oracle 中的 Job 是一个非常强大且灵活的功能,它允许开发者在数据库中执行计划任务,提高数据库的自动化程度和效率。那么,什么是 Oracle 中的 Job 呢? Oracle 中的 Job 是一个计划任务,它可以在指定的时间点或...

    oracle job 用法

    本文将深入探讨Oracle Job的用法,包括其基本概念、如何创建与管理Job,以及一系列实用的例子。 #### 创建Job 创建Job主要通过调用`DBMS_JOB.PACKAGE`中的`SUBMIT`过程来实现。基本语法如下: ```sql DBMS_JOB....

    Oracle各种select查询语法

    Oracle数据库管理系统提供了多种select查询语法,以下是常用的select查询语法和示例: 1、简单select查询语句 select * from emp; 该查询语句将查询emp表中的所有字段。 2、where子句 select * from emp ...

    Oracle Job定时任务.pdf

    通过 Oracle Job,用户可以根据需要,设置任务的执行时间和频率,从而提高数据处理效率和自动化程度。 一、查询系统中的 Job 为了查询系统中的 Job,用户可以使用以下三个视图: * DBA_JOBS:显示所有用户的 Job ...

    Oracle存储过程语法学习

    Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者封装一系列的SQL语句和PL/SQL代码,以供后续调用。存储过程可以提高数据库应用的性能,减少网络通信量,并提供更好的数据安全性。以下是对...

    oracle job 例子

    在本篇文章中,我们将深入探讨 Oracle Job 的概念、创建方法以及如何监控和管理这些任务。 首先,Oracle Job 通过 DBMS_JOB 包或 DBMS_SCHEDULER 包来创建和管理。DBMS_JOB 是早期版本 Oracle 提供的接口,而 DBMS_...

    Oracle创建视图(View)

    FORCE:不管基表是否存在ORACLE都会自动创建该视图(即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用); NOFORCE :如果基表不存在,无法创建视图,该项是默认选项...

    oracle-Job-管理.docx

    创建Job的基本语法如下: ```sql BEGIN DBMS_JOB.BEGIN(:jobno, 'your_procedure;', trunc(sysdate) + 1/24, trunc(sysdate) + 1/24 + 1); COMMIT; END; ``` 其中,`:jobno`是Job的编号,`your_procedure`是要执行...

    Oracle常用语法4

    根据提供的信息,我们可以总结出以下Oracle数据库中的常用语法知识点: ### Oracle 常用语法概览 #### 1....```sql SELECT object_name FROM ...这些基础语法是进行复杂查询的基础,也是理解和掌握Oracle数据库的关键。

    Oracle建立表格的语法

    ### Oracle建立表格的语法 在Oracle数据库中,创建表格是一项基本但非常重要的操作。通过`CREATE TABLE`语句,我们可以定义新的数据表及其结构。本文将详细介绍如何使用Oracle中的`CREATE TABLE`语句来创建表格,并...

    Oracle课程相关练习oracle-job-master.zip

    "Oracle课程相关练习oracle-job-master.zip"这个压缩包文件显然包含了与Oracle数据库学习相关的练习资料,可能是为了帮助学习者深入理解和掌握Oracle的各项功能和技术。下面我们将详细探讨Oracle数据库的一些关键...

    Oracle中job的使用详解.pdf

    本文档深入探讨了如何在Oracle环境中利用Job来实现定时任务,特别是通过DBMS_JOB包来创建和管理这些任务。 首先,了解Job的基本属性是很重要的。JOBNUMBER是每个Job的唯一标识,而LOG_USER、PRIV_USER和SCHEMA_USER...

Global site tag (gtag.js) - Google Analytics