Oracle個人使用手冊:
DBMS_JOB包
Broken()過程
作用:更新一個已提交的工作的狀態
procedure broken(job in binary_integer,broken in boolean, next_date in date :=sysdate);
job指的是工作號
broken指的是此工作是否被標記為開關
next_date指的是下一次執行時間,參數缺省值為當前日期和時間
用法舉例
--1.將開的job更改為關閉的狀態
begin
dbms_job.broken(1,true);
commit;
end;
--2.將關的job更改為開始的狀態,job執行時間為當下時間
begin
dbms_job.broken(1,false);
commit;
end;
--3.將關的job更改為開始的狀態,job執行時間為指定時間
begin
dbms_job.broken(1,false,to_date('2019-01-11 17:09:00','yyyy-mm-dd hh24.mi.ss'));
commit;
end;
Change()過程
作用:用来改变指定工作的设置 ,包括工作執行內容,下一次執行時間,執行時間間隔
procedure change(job in binary_integer,what in varchar2,next_date in date,interval in varchar2);
job指的是工作號
what指的job運行的代碼
next_date是下一次執行時間
interval是工作執行頻率
用法舉例
--1.改變一個已安排的工作號的工作執行內容,下一次執行時間及執行間隔
begin
dbms_job.Change(1,'
DECLARE
IN_S_MFGDATE VARCHAR2(200);
BEGIN
IN_S_MFGDATE := NULL;
SP_TEST ( 0, IN_S_MFGDATE );
COMMIT;
END; ','2019-02-01 07:30:00','TRUNC(SYSDATE+2)');
commit;
end;
Interval()過程
作用:用來設置工作的執行頻率
procedure Interval(job in binary_integer,interval in varchar2);
job指的是工作號
interval是工作的執行頻率
用法舉例
--1.改變一個已安排的工作號的執行間隔,注意字符串中有' 需要用''來表示'
begin
dbms_job.interval(1,'TRUNC(SYSDATE+10/1440,''MI'')');
commit;
end;
執行頻率的一般用法
1.每隔五分鐘執行
interval=>'TRUNC(SYSDATE,''MI'')+5/1440'
2.每個小時9分鐘,24分鐘,39分鐘,54分鐘執行
interval=>'TO_DATE(TO_CHAR(SYSDATE+1/96,''YYYYMMDDHH24'') || (TRUNC(TO_CHAR(SYSDATE+1/96,''MI'')/15)*15)+9 ,''YYYYMMDDHH24MI'')'
3.每天7點35分執行
interval=>'TRUNC(SYSDATE+1)+7/24+35/1440'
4.每週星期二的上午8點執行
interval=>'NEXT_DAY(TRUNC(SYSDATE),''TUSEDAY'')+8/24'
5.每月的二號的上午7點35執行
interval=>'ADD_MONTHS(TRUNC(SYSDATE,''MM''),1)+1+7/24+35/1440'
ISubmit()過程
作用:用特定的工作號提交一個工作
procedure ISubmit(job in binary_integer,what in varchar2,next_date in date,interval in varchar2,no_parse in boolean :=false);
job指的是要指定的未存在的工作號
what指的是工作執行內容
next_date指的是下一次工作執行時間
interval指的是工作執行時間間隔
no_parse指的是該工作號在提交或執行時是否進行語法分析 true指第一次執行時進行語法分析,false指立即進行語法分析
用法舉例
--1.新建一個JOB號為2的工作
begin
dbms_job.Isubmit(2,'
DECLARE
IN_S_MFGDATE VARCHAR2(200);
BEGIN
IN_S_MFGDATE := NULL;
SP_TEST( IN_S_MFGDATE );
COMMIT;
END; ','2019-02-01 07:30:00','TRUNC(SYSDATE+2)');
commit;
end;
Next_Date()過程
作用:用來設定一個工作的下一次執行時間
procedure Next_Date(job in binary_integer,next_date in date);
job指的是工作號
next_date指的是下一次被執行的日期和時間
用法舉例
--改變一個已安排的工作的下一次執行時間
begin
dbms_job.Next_Date(1,'2019-02-01 07:30:00');
commit;
end;
Remove()過程
作用:用來刪除一個已計劃運行的工作
procedure Remove(job in binary_integer)
job指的是工作號
用法舉例
--1.刪除一個已安排的工作
begin
dbms_job.Remove(2);
commit;
end;
Run()過程
作用:立即執行一個指定的工作
procedure Run(job in binary_integer)
job指的是工作號用法舉例
--1.立即將1裡面的內容執行一遍,即使是broken的job
begin
dbms_job.Run(1);
end;
Submit()過程
作用:用系統指定的工作號提交一個工作
procedure Submit(job out binary_integer,what in varchar2,next_date in date,interval in varchar2,no_parse in boolean:=false)
job指的是工作號
what指的是工作號執行內容
next_date指的是下一次工作號執行時間
interval指的是工作執行頻率
no_parse指的是該工作號在提交或執行時是否進行語法分析 true指第一次執行時進行語法分析,false指立即進行語法分析
用法舉例
--1.新建一個工作號由系統指定的工作
DECLARE
X NUMBER;
BEGIN
BEGIN
SYS.DBMS_JOB.SUBMIT
( job => X
,what => '
DECLARE
IN_S_MFGDATE VARCHAR2(200);
BEGIN
IN_S_MFGDATE := NULL;
G( 0,0);
COMMIT;
END; ',NEXT_DATE=>'2019-02-01 07:30:00',INTERVAL=>'TRUNC(SYSDATE+2)'
,no_parse => FALSE
);
END;
COMMIT;
END;
/
User_Export()過程
作用:導出指定工作的語法
procedure User_Export(job in binary_integer,content in out varchar2)
job指的是已安排的工作號
content指的是該工作號要重新提交時用的語法
用法舉例
--1.在需要JOB語法的時候將工作的語法導出,輸出部分即為語法
declare
sqlstring varchar2(2000);
begin
dbms_job.user_export(2,sqlstring);
dbms_output.put_line(sqlstring);
end;
What()過程
作用:在工作執行時,重新設置指定工作號的內容
procedure What(job in binary_integer, what in out varchar2)
job指的是已安排的工作號
what指的是重新設置該工作號要執行的內容
用法舉例
--1.將一個已安排的工作號的工作內容替換
begin
dbms_job.what(2, '
DECLARE
IN_S_MFGDATE VARCHAR2(200);
BEGIN
IN_S_MFGDATE := NULL;
G( 0,0);
COMMIT;
END; ');
commit;
end;
導出當前用戶下的JOB腳本語法
declare
user_name varchar2(30);
sqlstring varchar2(4000);
cursor jobs is select * from user_jobs;
begin
select user into user_name from dual;
dbms_output.put_line('execute immediate ''alter session set current_schema ='''|| :要插入的AP賬號||''';');
dbms_output.put_line('');
for i in jobs loop
dbms_job.user_export(i.job,sqlstring);
dbms_output.put_line(sqlstring);
dbms_output.put_line('');
sqlstring:='';
end loop;
dbms_output.put_line('execute immediate ''alter session set current_schema ='''|| user_name||''';');
commit;
end;
關閉當下用戶的未在運行的JOB腳本語法
DECLARE
CURSOR jobs IS
SELECT
*
FROM
user_jobs;
BEGIN
FOR i IN jobs LOOP
IF i.broken = 'N' THEN
IF i.this_date IS NULL THEN
dbms_job.broken(i.job, true);
ELSE
dbms_output.put_line('JOB:'
|| i.job
|| ' 執行時間:'
|| i.this_date);
END IF;
END IF;
END LOOP;
END;
開啟當下用戶的關閉的JOB腳本語法
DECLARE
CURSOR jobs IS
SELECT
*
FROM
user_jobs;
BEGIN
FOR i IN jobs LOOP
IF ( i.broken = 'Y' ) THEN
dbms_job.broken(i.job, false);
END IF;
END LOOP;
commit;
END;