前言
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);