我想它的答案有点晚了,但迟到总比没有好。您可以在重复间隔内使用 plssql 函数:
测试:11.2.0.3.0
让我们创建函数。my_schedules.odd_even如果当前分钟是偶数,它将返回 current_date + 30 秒,如果当前分钟是奇数,则返回 1 分钟:
CREATE OR REPLACE package my_schedules
is
function odd_even(p_date date default sysdate) return date;
end;
</code>
<code>
CREATE OR REPLACE package body my_schedules
is
-- even - 30 seconds
-- odd - 1 minute;
function odd_even(p_date date default sysdate)
return date
is
l_ret date;
l_sec_in_day number := 60*60*24;
begin
case mod( (to_number(to_char(sysdate,'MI'))) ,2)
when 0 then
--- even return 30 seconds
l_ret:= SYSDATE + 30/l_sec_in_day;
else
-- odd return a minute
l_ret:= SYSDATE + 60/l_sec_in_day;
end case;
return l_ret;
end;`enter code here`
end;
/
使用 repeat_interval= my_schedules.odd_even创建作业并启用该作业:
declare
l_action varchar2(2000);
l_repeat_interval varchar2(250) := 'my_schedules.odd_even';
l_job_name varchar2(30) := 'TESTING_PLSSQL_SCH';
begin
l_action := 'declare dummy number; begin dummy := 1; end;';
dbms_scheduler.create_job(job_name => '"'|| l_job_name||'"',
job_type => 'plsql_block',
job_action => l_action,
start_date => sysdate,
repeat_interval => l_repeat_interval,
comments => 'just a test'
);
dbms_scheduler.enable(name => '"'||l_job_name||'"');
end;
一会儿我们来看看结果:
select job_name, actual_start_date from DBA_SCHEDULER_JOB_RUN_DETAILS rd where job_name = 'TESTING_PLSSQL_SCH' order by actual_start_date;
job_name | actual_start_date
--------------------------
TESTING_PLSSQL_SCH 2016/07/14/ 17:33:36,671977 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:34:36,007573 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:35:06,006206 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:36:06,001652 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:36:36,005513 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:37:06,003572 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:38:06,011409 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:38:36,011411 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:39:06,011357 +03:00
TESTING_PLSSQL_SCH 2016/07/14/ 17:40:06,002623 +03:00
Oracle 数据库在线文档 11g 第 1 版 (11.1) / 数据库管理/使用计划:这里