优秀是一种习惯 , 生活是一种过程, 放弃是一种智慧 , 缺点是一种恩惠。
爱好:看书/K歌/上网/游泳/汉服 哼着單身情歌,彈着藍色吉它,展示突然的自我 QQ:19636427 另觅:160左右的女孩
Oracle 基礎 ---Oracle JOBS
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:
-
引用
删除
tieshuai / 2008-02-26 15:43:28
-
1、Oracle与Job有关的操作都是通过DBMS_JOB来完成的;
2、后台进程CJQ0(Coordinate Job Queue)定期查询dba_views,并将这些job按时间进行排序。当发现一个Job可以运行了,就自动产生一个Job Queue进程(Jnnn)来执行这个Job.
3、通过数据库的参数JOB_QUEUE_PROCESSES来控制:1)是否启动CJQ0 2)Job Queue进程的个数(即可同事执行的Job的最大个数)。JOB_QUEUE_PROCESSES为0,则CJQ0不启动,所有Job均不会如期执行。JOB_QUEUE_PROCESSES为为20,表明最大20个Job可以同时运行. JOB_QUEUE_PROCESSES参数是dynamic的,可动态修改:ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;
4、创建一个JOB:
VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'', ''EMPLOYEES'',
''ESTIMATE'', NULL, 50);',
SYSDATE, 'SYSDATE + 1');
COMMIT;
END;
/
PRINT jobno
DBMS_JOB.SUBMIT的格式为:
SUBMIT(JOBNO,WHAT,NEXT_DATE,INTERVAL,NO_PARSE),其中:
jobno是一个OUT参数。当SUBMIT执行完毕,jobno会带出ORACLE分配的job号码。这个job号码作为这个JOB的标识
WHAT是这个JOB要做的事情。用''引起来的任何PL/SQL语句
NEXT_DATE是下次要执行这个JOB的时间。默认为SYSDATE
INTERVAL是间隔,决定了这个任务下次运行的时间。每次JOB运行时,都会计算这个INTERVAL字段,并在执行完毕后将这个值放到NEXT_DATE字段中去,作为下次执行的时间;
NO_PARSE:决定WHAT部分的东西实在SUBMIT的时候进行解析(FALSE)还是第一次执行的时候解析(TRUE)。
5、常见的WHAT:
'myproc(''10-JAN-99'', next_date, broken);'
'scott.emppackage.give_raise(''JFEE'', 3000.00);'
'dbms_job.remove(job);'
6、常见的INTERVAL:
'SYSDATE + 7' 每七天
'SYSDATE + 1/48' 每半小时
'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 15/24' 每周一的下午三点
'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, ''Q''), 3), ''THURSDAY'')' 每季度的第1个星期四
7、删除一个JOB
BEGIN
DBMS_JOB.REMOVE(14144);
END;
/
8、Altering JOB
1)
BEGIN
DBMS_JOB.CHANGE(14144, NULL, NULL, 'SYSDATE + 3');
END;
/
2)
BEGIN
DBMS_JOB.WHAT(14144,'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',
''HR'', ''DEPARTMENTS'',
''ESTIMATE'', NULL, 50);');
END;
/
3)
BEGIN
DBMS_JOB.NEXT_DATE(14144, SYSDATE + 4);
END;
/
4)
BEGIN
DBMS_JOB.INTERVAL(14144, 'NULL');
END;
/
9、broken job
一个JOB处于broken状态,这个JOB就不会再被执行。可以手工置这个状态,也可以再JQ尝试执行一个JOB失败16次后自动置;
10、强迫执行JOB
BEGIN
DBMS_JOB.RUN(14144);
END;
/
11、停止JOB
找到JOB对应得SESSION,然后用ALTER SYSTEM KILL SESSION来KILL
12、相关VIEW
USER_JOBS
ALL_JOBS
DBA_JOBS
这些VIEW里边是COMMIT的JOB
DBA_JOBS_RUNNING里是正在RUN的JOB。停止JOB的时候,可以从这个里边找SESSION的ID。
-
引用
删除
tieshuai / 2008-02-26 15:19:16
-
job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识一个工作。
what参数是将被执行的PL/SQL代码块。 [bitsCN_com]
next_date参数指识何时将运行这个工作。
interval参数何时这个工作将被重执行。
no_parse参数指示此工作在提交时或执行时是否应进行语法分析——TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
9、User_Export()过程返回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交。
此程序有两个参数:job与my_call。
PROCEDURE User_Export(job IN binary_ineger,
my_call IN OUT varchar2)
job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文。
10、What()过程应许在工作执行时重新设置此正在运行的命令。这个过程接收两个参数:job与what。
PROCEDURE What (job IN binary_ineger,
What IN OUT varchar2)
job参数标识一个存在的工作。what参数指示将被执行的新的PL/SQL代码。
三、查看相关job信息
1、相关视图
dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在运行job相关信息
bitsCN~com
2、查看相关信息
SQL>SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN
SQL>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.
四、简单例子
一个简单例子: bitsCN#com中国网管联盟
创建测试表
SQL> create table TEST(a date);
表已创建。
创建一个自定义过程
SQL> create or replace procedure MYPROC as
2 begin
3 insert into TEST values(sysdate);
4 end;
5 /
过程已创建。
创建JOB
SQL> variable job1 number;
SQL>
SQL> begin
2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
3 end;
4 /
PL/SQL 过程已成功完成。
运行JOB
SQL> begin
2 dbms_job.run(:job1);
3 end;
4 /
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(:job1);
3 end;
4 /
bitsCN~com
PL/SQL 过程已成功完成。
