SQLServer中有相关的定时计划,可以直接打开sql server 的任务管理器进行配置,可以方便、快速实现定时执行相应任务。相应的Oracle也有对应的定时计划,只不过没有一个很好的图形界面供用户去操作。本文主要是为了方便用户在Oracle中快速创建定时计划,定期执行相应的sql或者存储过程。
说明:以下所有的示例代码,都需要用户先连上sql/plus之后,在sql/plus中执行。
存储过程不是必须的,只不过是把相关的一系列的sql语句整合在一块,方便执行。
示例:
create or replace procedureupdate_black_gray_list as
begin
UPDATE SMS_BLACKLIST //要执行的sql语句
SET FLAG='0',"ENABLE"='2',
FDATE=TO_DATE(TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd'), 'yyyy-mm-dd')),
TDATE=TO_DATE(TO_DATE(TO_CHAR(SYSDATE+7,'yyyy-mm-dd'), 'yyyy-mm-dd'))
WHERE FLAG='0' AND "ENABLE"='0'AND
TDATE<TO_DATE(TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd'), 'yyyy-mm-dd'));
end;
/
示例:
variable update_list_job number;
begin
dbms_job.submit(:update_list_job,'update_black_gray_list;',TRUNC(SYSDATE),'TRUNC(SYSDATE+1)');
end;
/
变量update_list_job是为了存储创建生成的计划的唯一标识号,方便删除,查看该定时计划的相关信息
PROCEDUREsubmit (
job OUT binary_ineger,
whatINvarchar2,
next_date INdate,
intervalINvarchar2,
no_parseINbooean:=FALSE)
这个过程有五个参数:job、what、next_date、interval与no_parse。
l job参数是由Submit()过程返回的binary_ineger。这个值用来唯一标识job。
l what参数是将被执行的PL/SQL代码块(一般多是存储过程)。
l next_date参数指识何时将运行这个工作。
l interval参数何时这个工作将被重执行。
interval是指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用‘sysdate+m’表示。
示例:
每天运行一次'SYSDATE + 1'
每小时运行一次 'SYSDATE +1/24'
每分钟运行一次 'SYSDATE + 1/(60*24)'
每秒运行一次 'SYSDATE + 1/(60*24*60)'
每隔一星期运行一次 'SYSDATE + 7'
每天午夜12点 'TRUNC(SYSDATE+ 1)'
每天早上1点30分 'TRUNC(SYSDATE+ 1) + (1*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)'
不再运行该任务并删除它 NULL
l no_parse参数指示此工作在提交时或执行时是否应进行语法分析(默认为false)——TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,而FALSE指示本PL/SQL代码应立即进行语法分析。
示例:
begin
dbms_job.run(:update_list_job);
end;
/
示例:
begin
dbms_job.remove(:update_list_job);
end;
/
select * from user_jobs;
begin
for v in(select job from user_jobs) loop
dbms_job.remove(v.job);
end loop;
commit;
end;
begin
for v in(select job from user_jobs where whatin( 'the_what_name;' ) )
loop
dbms_job.remove(v.job);
endloop;
commit;
end;
/
begin
for v in(select job from user_jobs wherelog_user='USERXXXX') loop
dbms_job.remove(v.job);
end loop;
commit;
end;
/