前言
Oracle提供了幾個包,它們可以用來完成很多任務,從內部進程通訊到檔案I/O,到在PL/SQL塊中動態建立和執行SQL語句。所有這些包由SYS使用者所擁有—當Oracle最初安裝時兩個使用者中的一個,這些包中最重要的包括:
DBMS_Alert 不用輪詢就允許應用命名並發出警告條件訊號的過程與函數
DBMS_DDL 允許擷取PL/SQL程式內部一定數量的DDL語句的過程
DBMS_Describe 為預存程序與函數描述API的過程
DBMS_Job 管理BLOBs、CLOBs、NCLOBs與BFILEs的過程與函數
DBMS_Output 允許PL/SQL程式產生終端輸出的過程與函數
DBMS_Pipe 允許資料庫會話使用管道通訊(通訊頻道)的過程與函數
DBMS_SQL 在PL/SQL程式內部執行動態SQL的過程與函數
DBMS_Utility
UTL_File 允許PL/SQL程式讀寫伺服器檔案系統上的文字檔的過程與函數
用DBMS_JOB來實現進階計劃任務
程式有三個參數:需要提交的任務的名字、啟動任務的時間已經執行該任務的間隔時間。
dbms_job.submit(what='statspack_alert.sql;',
next_date=sysdate+1/24,——在下一個小時後啟動
interval='sysdate+1/24');——每小時運行一次
問題是,儘管我們在這個程式中指定了任務起始時間和重新執行的時間間隔,但是我們看不到在預定時間運行該任務的機制。例如,如何讓一個任務在早上8點啟動、每小時 運行一次、最後在下午5點終止呢?
上面的例子讓該任務每小時運行一次,但是為了獲得時間間隔,它有必要建立兩個其它任務:
一個任務在下午5點終止(主)任務,
另一個任務在第二天早上8點啟動(主)任務。
為了實現進階計劃任務,我們可以建立自訂間隔,讓任務在特定的時間間隔來啟動和終止。下面是一個例子:
Schedule a snapshot to be run on this instance every hour
variable jobno number;
variable instno number;
begin
select instance_number into :instno from v$instance;
提交任務從6:00開始,每小時運行一次
dbms_job.submit(
jobno, 'statspack.snap; ',
trunc(sysdate)+6/24,
'trunc(SYSDATE+1/24,''HH'')',
TRUE,
instno);