oracle user_scheduler_jobs,Oracle 定时任务dbms_scheduler
1. 簡介
在Oracle 10g之前,我們通過DBMS_JOB來管理定時任務(wù);
而10g之后,則推薦使用DBMS_SCHEDULER來管理定時任務(wù),因?yàn)樗峁┝烁鼜?qiáng)大的功能和靈活的機(jī)制。
2. 需要的權(quán)限
CREATE JOB ? ? ? ? ?-- (必須, 要執(zhí)行DBMS_SCHEDULER, 需要有create job權(quán)限)
CREATE EXTERNAL JOB -- (可選, 創(chuàng)建執(zhí)行操作系統(tǒng)命令的job時需要)
# 查詢用戶所擁有的角色以及角色所包含的權(quán)限
select * from role_sys_privs where role in (
select granted_role from dba_role_privs where grantee='SCOTT'
) order by role;
# 查詢直接授予用戶的權(quán)限
select * from dba_sys_privs where grantee='SCOTT';
3. 一個簡單的Demo
3.1 創(chuàng)建JOBcreate?table?test_t1(id?int,?create_date?date);
create?or?replace?procedure?test_p1
is
v_maxId?test_t1.id%type?:=?1;
begin
select?nvl(max(id),?0)?into?v_maxId?from?test_t1;
insert?into?test_t1?values(v_maxId?+?1,?sysdate);
commit;
end?test_p1;
/
declare
v_count?int?:=?0;
begin
select?count(*)?into?v_count?from?user_scheduler_jobs?where?job_name='TEST_JOB1';
if?v_count?>?0?then
dbms_scheduler.drop_job('TEST_JOB1');
end?if;
dbms_scheduler.create_job?(
job_name????????=>?'test_job1',
job_type????????=>?'STORED_PROCEDURE',
job_action??????=>?'TEST_P1',
start_date??????=>?sysdate,
repeat_interval?=>?'FREQ=MINUTELY;INTERVAL=1',
enabled?????????=>?true
);
end;
/job_name????????:?必選,?任務(wù)名稱
job_type????????:?必選,?任務(wù)類型(
PLSQL_BLOCK,??????--?執(zhí)行一個PL/SQL匿名快
STORED_PROCEDURE,?--?執(zhí)行一個存儲過程
EXECUTABLE,???????--?執(zhí)行一個外部程序
CHAIN?????????????--?執(zhí)行一個CHAIN
)
job_action??????:?必選,?任務(wù)內(nèi)容,?與job_type配合使用
start_date??????:?可選,?首次執(zhí)行時間,?為空時表示立即執(zhí)行
repeat_interval?:?可選,?執(zhí)行頻率,?為空時表示只執(zhí)行一次(
FREQ=MINUTELY;?--?表示間隔單位,?可選值有YEARLY,?MONTHLY,?WEEKLY,?DAILY,?HOURLY,?MINUTELY,?SECONDLY
INTERVAL=1?????--?表示間隔周期
)
enabled?????????:?可選,?是否啟用任務(wù)
詳細(xì)參數(shù)可參考:http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#ARPLS72960
3.2 查看JOB執(zhí)行情況
-- 查看已創(chuàng)建的JOB
select job_name, job_type, enabled, state from user_scheduler_jobs;
-- 查看JOB運(yùn)行日志
select log_id, log_date, status from user_scheduler_job_run_details where job_name='TEST_JOB1';
3.3 刪除JOB
exec dbms_scheduler.drop_job('TEST_JOB1');
Oracle Scheduler Jobs
Repeat Interval參數(shù)
FREQ 關(guān)鍵字用來指定間隔的時間周期,可選參數(shù)有:YEARLY(年),?MONTHLY(月),?WEEKLY(周),?DAILY(日),?HOURLY(時),?MINUTELY(分), SECONDLY(秒)等單位。
INTERVAL 關(guān)鍵字用來指定間隔的頻繁,可指定的值的范圍從1-999。
BYHOUR? 指定一天中的小時。可指定的值的范圍從1-24。16,17,18就表示每天下午的4、5、6點(diǎn)。
BYDAY 關(guān)鍵字用來指定每周的哪天運(yùn)行。
BYMONTHDAY 關(guān)鍵字用來指定每月中的哪一天。-1 表示每月最后一天。
BYMONTH? 關(guān)鍵字用來指定每年的月份。
BYDATE 指定日期。0310就表示3月10日。
例如:
運(yùn)行每星期五。(所有這三個例子是等價的。)FREQ=DAILY;?BYDAY=FRI;
FREQ=WEEKLY;?BYDAY=FRI;
FREQ=YEARLY;?BYDAY=FRI;
設(shè)置任務(wù)隔一周運(yùn)行一次,并且僅在周5運(yùn)行:FREQ=WEEKLY;?INTERVAL=2;?BYDAY=FRI;
在每月的最后一天運(yùn)行FREQ=MONTHLY;?BYMONTHDAY=-1;
三月十日開。(兩個例子是等價的)FREQ=YEARLY;?BYMONTH=MAR;?BYMONTHDAY=10;
FREQ=YEARLY;?BYDATE=0310;
設(shè)置任務(wù)每10隔天運(yùn)行:REPEAT_INTERVAL?=>?'FREQ=DAILY;?INTERVAL=10';
設(shè)置任務(wù)在每天的下午4、5、6點(diǎn)時運(yùn)行:REPEAT_INTERVAL?=>?'FREQ=DAILY;?BYHOUR=16,17,18';
設(shè)置任務(wù)在每月29日運(yùn)行:REPEAT_INTERVAL?=>?'FREQ=MONTHLY;?BYMONTHDAY=29';
設(shè)置任務(wù)在每年的最后一個周5運(yùn)行:REPEAT_INTERVAL?=>?'FREQ=YEARLY;?BYDAY=-1FRI';
設(shè)置任務(wù)每隔50個小時運(yùn)行:REPEAT_INTERVAL?=>?'FREQ=HOURLY;?INTERVAL=50';
repeat_interval => 'FREQ=HOURLY; INTERVAL=2'
每隔2小時運(yùn)行一次job
repeat_interval => 'FREQ=DAILY'
每天運(yùn)行一次job
repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"
每周的1,3,5運(yùn)行job
repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'
每年的3,6,9,12月的30號運(yùn)行job
既然說到了repeat_interval,你可能要問:"有沒有一種簡便的方法來得出,或者說是評估出job的每次運(yùn)行時間,以及下一次的運(yùn)行時間呢?"dbms_scheduler包提供了一個過程evaluate_calendar_string,可以很方便地完成這個需求!
https://www.cnblogs.com/lanzi/archive/2012/11/23/2784815.html
總結(jié)
以上是生活随笔為你收集整理的oracle user_scheduler_jobs,Oracle 定时任务dbms_scheduler的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪吒闹海国画是谁画的啊?
- 下一篇: oracle sql判断相等,获取多行相