Oracle中Job的编写
在Oracle中可以编写Job来定时执行一个存储过程。具体做法是,使用Submit()过程
Submit过程的几个参数:job、what、next_date、interval与no_parse。
Submit的方法签名是:
PROCEDURE Submit (
job OUT binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
签名参数解析:
job参数
Submit()过程返回的binary_integer。用来唯一标识一个job
what参数
将要被执行的PL/SQL代码块
next_date
指示何时将运行这个工作
interval
何时这个工作将被重新执行
no_parse
指示此Job在提交时或执行时是否应进行语法分析--TRUE
--每天1440分钟,即一分钟运行test过程一次
begin
sys.dbms_job.submit(job => :job,
what => 'prc_g_test',
next_date=>to_date('2011-11-30 15:00:00', 'yyyy-mm-dd hh24:mi:ss'),
interval => 'sysdate + 1/1440');
);
commit;
end;
/
-- 1.create TABLE
CREATE TABLE g_test(
ID NUMBER(12),
c_date DATE
);
-- 2. create sequence
CREATE SEQUENCE g_seq
MINVALUE 1
MAXVALUE 9999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
--3. create procedure
CREATE OR REPLACE PROCEDURE prc_g_test IS
BEGIN
INSERT INTO g_test VALUES(g_seq.NEXTVAL, SYSDATE);
END prc_g_test;
--4. create job
--这个过程有五个参数:job、what、next_date、interval与no_parse。
PROCEDURE submit(job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE,
INTERVAL IN VARCHAR2,
no_parse IN BOOLEAN:=FALSE
)
DECLARE
job NUMBER;
BEGIN
sys.dbms_job.submit(job, 'prc_g_test;',SYSDATE, 'sysdate + 1/1440');
END;
-- 查看Job信息
SELECT * FROM DBA_JOBS ;
SELECT * FROM DBA_JOBS_RUNNING;
SELECT * FROM g_test ORDER BY ID ASC;
-- 运行Job
-- job = 22
BEGIN
DBMS_JOB.run(22);
END;
/
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 /
描述 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)'
参考来源: http://guyuanli.itpub.net/post/37743/484763
在Oracle中可以编写Job来定时执行一个存储过程。具体做法是,使用Submit()过程
Submit过程的几个参数:job、what、next_date、interval与no_parse。
Submit的方法签名是:
PROCEDURE Submit (
job OUT binary_ineger,
What IN varchar2,
next_date IN date,
interval IN varchar2,
no_parse IN booean:=FALSE)
签名参数解析:
job参数
Submit()过程返回的binary_integer。用来唯一标识一个job
what参数
将要被执行的PL/SQL代码块
next_date
指示何时将运行这个工作
interval
何时这个工作将被重新执行
no_parse
指示此Job在提交时或执行时是否应进行语法分析--TRUE
--每天1440分钟,即一分钟运行test过程一次
begin
sys.dbms_job.submit(job => :job,
what => 'prc_g_test',
next_date=>to_date('2011-11-30 15:00:00', 'yyyy-mm-dd hh24:mi:ss'),
interval => 'sysdate + 1/1440');
);
commit;
end;
/
-- 1.create TABLE
CREATE TABLE g_test(
ID NUMBER(12),
c_date DATE
);
-- 2. create sequence
CREATE SEQUENCE g_seq
MINVALUE 1
MAXVALUE 9999999999
START WITH 1
INCREMENT BY 1
CACHE 20;
--3. create procedure
CREATE OR REPLACE PROCEDURE prc_g_test IS
BEGIN
INSERT INTO g_test VALUES(g_seq.NEXTVAL, SYSDATE);
END prc_g_test;
--4. create job
--这个过程有五个参数:job、what、next_date、interval与no_parse。
PROCEDURE submit(job OUT BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE,
INTERVAL IN VARCHAR2,
no_parse IN BOOLEAN:=FALSE
)
DECLARE
job NUMBER;
BEGIN
sys.dbms_job.submit(job, 'prc_g_test;',SYSDATE, 'sysdate + 1/1440');
END;
-- 查看Job信息
SELECT * FROM DBA_JOBS ;
SELECT * FROM DBA_JOBS_RUNNING;
SELECT * FROM g_test ORDER BY ID ASC;
-- 运行Job
-- job = 22
BEGIN
DBMS_JOB.run(22);
END;
/
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 /
每天1点执行的oracle JOB样例
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X,
what => 'ETL_RUN_D_Date;',
next_date => to_date('2009-08-26 01:00:00','yyyy-mm-dd hh24:mi:ss'),
interval => 'trunc(sysdate)+1+1/24',
no_parse => FALSE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
/
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X,
what => 'ETL_RUN_D_Date;',
next_date => to_date('2009-08-26 01:00:00','yyyy-mm-dd hh24:mi:ss'),
interval => 'trunc(sysdate)+1+1/24',
no_parse => FALSE
);
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
COMMIT;
END;
/
以上是明确指定每天的1点执行此job,如果指定是每天中午12点执行interval需要指定为'trunc(sysdate)+1+12/24',如果仅仅指定interval为一天,这样当你手工用dbms_job.run(job)去运行一次时,job每天的执行时间是会改变的,如果你想job每天在固定时间执行,可以参考上面的例子.
描述 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)'
参考来源: http://guyuanli.itpub.net/post/37743/484763