重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创建scheduler,PL/SQL Developer里可以直接创建,也可以写SQL创建,类似以下语法:
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站设计、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的平舆网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
begin
sys.dbms_scheduler.create_schedule(schedule_name = 'FRQ_CATALOG.TT',
start_date = to_date('18-10-2011 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
repeat_interval = 'Freq=Daily;Interval=0',
end_date = to_date('31-10-2011 00:00:00', 'dd-mm-yyyy hh24:mi:ss'),
comments = '');
end;
如果懂了希望点一下采纳
1.create table test(id int,starttime date,state int);
2.create or replace procedure sp_update is
cursor cur is select * from test where state=0;
v_id int;
v_starttime date;
v_state int;
begin
open cur;
loop
fetch cur into v_id,v_starttime,v_state;
exit when cur%notfound;
update test set state=1 where starttime=sysdate;
commit;
end loop;
close cur;
end;
/
3.创建JOB
SQL variable job1 number;
SQL
SQL begin
2 dbms_job.submit(:job1,sp_update;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行sp_update过程一次
3 end;
4 /
PL/SQL 过程已成功完成。
运行JOB
SQL begin
2 dbms_job.run(:job1);
3 end;
4 /
oracle job 时间每五分钟执行:
begin
sys.dbms_job.submit(job = :job,
what = '一个存储过程;',
Interval =TRUNC(sysdate,'mi') + 5/ (24*60));
commit;
end;
其中:如果改成TRUNC(sysdate,'mi')+ 10/ (24*60) 就是每10分钟执行次。每秒钟执行次:Interval = sysdate+ 1/(24 * 60 * 60)。如果改成sysdate + 10/(24 *60 * 60)就是10秒钟执行次。
使用dbms_job.submit方法过程,这个过程有五个参数:job、what、next_date、interval与no_parse:
1、job参数是输出参数,由submit()过程返回的binary_ineger,这个值用来唯一标识一个工作。一般定义一个变量接收,可以去user_jobs视图查询job值。
2、what参数是将被执行的PL/SQL代码块,存储过程名称等。
3、next_date参数指识何时将运行这个工作。
4、interval参数何时这个工作将被重执行。
5、no_parse参数指示此工作在提交时或执行时是否应进行语法分析——true,默认值false。指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
扩展资料:
1、每天定时执行
例如:每天的凌晨1点执行
Interval =TRUNC(sysdate) + 1 +1/ (24)
2、每周定时执行
例如:每周一凌晨1点执行:
Interval =TRUNC(next_day(sysdate,'星期一'))+1/24
3、每月定时执行
例如:每月1日凌晨1点执行:
Interval=TRUNC(LAST_DAY(SYSDATE))+1+1/24
4、每季度定时执行
例如每季度的第一天凌晨1点执行:
Interval =TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
参考资料来源:百度百科-Oracle系统
参考资料来源:百度百科-Oracle PL/SQL从入门到精通
我感觉你应该是不知道怎么写每月和每年吧。其实很简单,把你下次时间的字符串拿出来看下就行。下面是代码。
DECLARE
I4 INTEGER;I5 INTEGER;
BEGIN
--每月5号中午12点
DBMS_JOB.SUBMIT(I4,'YOUR PROC;',SYSDATE,'TRUNC(SYSDATE, ''MM'') + 4 + 12 / 24');
--每年1月10号中午12点
DBMS_JOB.SUBMIT(I5,'YOUR PROC;',SYSDATE,'TRUNC(SYSDATE, 'Y') + 9 + 12 / 24');
COMMIT;
END;
用job,具体用法:
declare
n_job binary_integer;
begin
dbms_job.submit(n_job, '你要执行的东西', sysdate, TRUNC(LAST_DAY(SYSDATE))+4+2/24);
end;
-- 每月4号执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(LAST_DAY(SYSDATE))+4+2/24');
-- 每分钟执行一次
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(sysdate,’mi’) + 1 / (24*60)');
-- 凌晨两点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(sysdate) + 1 + 2/24');
-- 每周一凌晨2点执行 周一是每周的第二天next_day(sysdate,2)同理周二是第三天,next_day(sysdate,3)
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(next_day(sysdate,2))+2/24');
-- 每月1日凌晨两点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(LAST_DAY(SYSDATE))+1+2/24');
-- 每季第一天凌晨两点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate,'TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24');
-- 每年7月1日和1月1日凌晨2点
dbms_job.submit(n_job_01,'你调的东西',sysdate,'ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24');
-- 每年1月1日凌晨2点执行
dbms_job.submit(n_job_01,'你调的东西',sysdate, 'Add_months(trunc(sysdate,'yyyy'), 12) +2/24');
通过网上查询,找到一种方案,就是先在oracle里面对要定时的sql写成存储过程,再用DBMS_scheduler对存储过程进行定时执行。
在数据库中新建了一个表MY_JOB_TEST
在数据库中新建了一个表MY_JOB_TEST
在数据库中新建了一个表MY_JOB_TEST
在PLSQL中,执行下面语句模拟存储过程的调用,执行后要点提交才有反应
[sql] view plain copy
BEGIN
INSERT INTO MY_JOB_TEST (NUM) VALUES (1);
END;
然后下面建立一个存储过程JOB_TEST
(注意,这里用户需要CREATE JOB权限,可以用超级管理员用户执行下面语句给指定用户赋予该权限)
[sql] view plain copy
Grant Create Job To 指定用户名
[sql] view plain copy
SQLCREATE OR REPLACE PROCEDURE
JOB_TEST
BEGIN
INSERT INTO MY_JOB_TEST (NUM) VALUES (1);
END;
(此处要执行存储过程不能用exec JB_TEST,这种执行方式只能在命令行中使用)
使用DBMS_SCHEDULER进行定时,这里为每分钟执行一次
[sql] view plain copy
SQL BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name = 'SCHEDULER_TEST',
job_type = 'STORED_PROCEDURE',
job_action = 'JOB_TEST',
start_date = sysdate,
repeat_interval = 'FREQ=MINUTELY;INTERVAL=1');
END;
但是这样子定时任务并不会执行。
我们可以用下面的命令查看一下scheduler的状态
[plain] view plain copy
SQLSELECT * FROM USER_SCHEDULER_JOBS;
此时我们可以看到enable的状态是false的,因此我们需要去启动定时任务
[plain] view plain copy
SQLBEGIN
DBMS_SCHEDULER.ENABLE('SCHEDULER_TEST');
END
dbms_scheduler.enable('j_test'); --启用jobs
dbms_scheduler.disable('j_test'); --禁用jobs
dbms_scheduler.run_job('j_test'); --执行jobs
dbms_scheduler.stop_job('j_test'); --停止jobs
dbms_scheduler.drop_job('j_test'); --删除jobs
然后再查询job的enable装态,发现为true了。
然后查看MY_JOB_TEST表,发现每分钟会往里面添加记录。
当需要修改定时任务或者调度的其他属性时,可以用下面的
dbms_scheduler.set_attribute('调度名','调度属性','调度值');
至此,定时任务完成。