1、 SUBMIT
該過程用於建立一個新的作業,當建立作業的時候,需要通過設置相應的參數來告訴Oracle要執行的內容,要執行的時間,要執行任務的間隔。如下格式:
DBMS_JOB.SUBMIT(
JOB OUT BINARY_INTERGER,
WHAT IN VARCHAR2,
NEXT_DATE IN DATE DEFAULT SYSDATE,
INTERVAL IN VARCHAR2 DEFAULT ‘NULL’,
NO_PARSE IN BOOLEAN DEFAULT FALSE,
INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,
FORCE IN BOOLEAN DEFAULT FALSE
);
參數說明:
| 編號 |
參數 |
參數說明 |
| 1 |
job |
用於指定作業編號 |
| 2 |
what |
用於指定作業要執行的操作 |
| 3 |
next_date |
用於指定該操作的下一次運行的日期 |
| 4 |
interval |
用於指定該操作的時間間隔 |
| 5 |
no_parse |
用於指定是否需要解析與作業相關的過程 |
| 6 |
instance |
用於指定哪個例程可以運行作業? |
| 7 |
force |
用於指定是否強制運行與作業相關的例程 |
建立Oracle作業的例子:
--如果表存在就刪除,然后創建一個新表 drop table testjob cascade constraints; create table testjob( id number constraint testjob_id_pk primary key, name varchar2(30) ); --如果序列存在就刪除,然后創建一個序列 drop sequence testjob_id_seq; create sequence testjob_id_seq; --創建一個序列,每一次向表中插入一條數據,並且表中的id字段值使用序列指定 create or replace procedure insert_job is begin insert into testjob values(testjob_id_seq.nextval,'test'||testjob_id_seq.currval); commit; end; / declare jobno binary_integer; begin --提交,操作的時間間隔設置為1分鍾 dbms_job.submit(jobno,'insert_job();',sysdate,'sysdate+1/(24*60)'); --打印序列號 dbms_output.put_line('jobno='||jobno); --運行 dbms_job.run(jobno); end; /
interval參數值
| 描述 |
Interval參數值 (部分需要驗證一下) |
| 每天午夜12點 |
'TRUNC(SYSDATE + 1)' |
| 每天早上8點30分 |
'TRUNC(SYSDATE + 1) + (8*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' |
| 每分鍾執行一次 |
'SYSDATE+1/1440' |
2、 REMOVE
這個過程的作用是用於刪除作業隊列當中的特定的作業,它的語法如下:
DBMS_JOB.REMOVE(JOB IN BINARY_INTEGER);
下面是一個刪除作業的例子:
首先查看DBA_JOBS表,看表里面有哪些任務正在執行着?
SELECT * FROM DBA_JOBS;
可以看到里面的JOB就是我們要刪除的作業的編號,LOG_USER是創建該任務的人。
SQL> EXEC DBMS_JOB.REMOVE(467);
SQL>COMMIT;
這樣就能把已經建立的作業刪除了。
3、 CHANGE
該過程改變與作業相關的所有的信息,其中包括作業的操作內容,作業運行的時間以及運行時間間隔信息等等。語法如下:
DBMS_JOB.CHANGE(
JOB IN BINARY_INTEGER,
WHAT IN VARCHAR2,
NEXT_DATE,
INTERVAL IN VARCHAR2,
INSTANCE IN BINARY_INTEGER DEFAULT NULL,
FORCE IN BOOLEAN DEFAULT FALSE
);
例子:
SQL>EXEC DBMS_JOB.CHANGE(2,NULL,NULL,’SYSDATE+2’);
SQL>COMMIT;
4、 WHAT
WHAT用來改變作業要執行的操作,例如:
SQL>EXEC DBMS_JOB.WHAT(268,’GETGX_AC01;’);
5、 NEXT_DATE
用來改變作業的下次運行日期
SQL>EXEC DBMS_JOB.NEXT_DATE(‘478’,’SYSDATE+2’);
6、 INTERVAL
該過程用來改變作業的運行時間間隔,下面的運行時間間隔修改為每分鍾執行一次:
SQL>exec dbms_job.interval(478,’SYSDATE+1/24/60
7、 BROKEN
該過程用於給該作業打上中斷標志,可以在DBA_JOBS表里面觀察該作業的BROKEN標志知否為中斷。例子:
SQL>EXEC DBMS_JOB.BROKEN(478,TRUE);
SQL>COMMIT;
8、 RUN
該過程用來執行該作業,例子:
SQL>EXEC DBMS_RN(478);
SQL>COMMIT;
常見問題:
1、 如何停止一個作業?
SQL>DBMS_JOBS.BROKEN(2,TRUE);
SQL>COMMIT;
這里務必要提交哈!
2、 如何啟動一個作業?
SQL>DBMS_JOBS.BROKEN(2,FALSE);
SQL>COMMIT;
這里也務必要提交,否則就沒有效果
3、 前面提到的JOB_QUEUE_PROCESSES在什么地方設置?
ALTER SYSTEM SET job_queue_processes=39 SCOPE=SPFILE;
這個SQL的執行是需要具備相應的權限的。
4、 如何計算一個過程運行的時間(DATE和TimeStamp)?
可以在過程的開始設置一個時間,然后在過程的結尾處設置一個時間,然后兩個時間的時間差可以計算出該過程運行的時間。通過實踐發現使用SYSESTAMP來計算時間比較准確一些:
SELECT to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff4') FROM dual;
