Oracle 的排程器(Scheduler) 是由一支背景執行的 CJQ0 (JOB QUEUE COORDINATOR) 來監控管理,主要的動態VIEWS 為 DBMS_SCHEDULER_JOBS。若有使用者指定的 JOB 執行時,會指派 JOB ID,如 Jnnn,其中 nnn為 JOB ID。
JOB ID 的範圍由參數JOB_QUEUE_PROCESSES (預設1000):若設為0,Scheduler不會啟動。
SCHEDULER 的背景程式
下圖顯示在系統背景執行的這支 CJQ0。
或是由LINUX的SHELL也可看出
使用以下查詢都可以找出在背景執行的 JOBS
select * from v$process where pname like 'CJQ%';
或是
select program from v$process where program like '%J%';
SCHEDULER 的 PACKAGE
主要是 DBMS_SCHEDULER ,該套件有許多介面可供使用,可透過 DESCRIBE DBMS_SCHEDULER 來查詢。所建立的為資料庫的物件,僅列舉以下常常使用的使用方法
- CREATE JOB
JOB 包含幾個重點:做什麼 (WHAT) 和何時做 (WHEN)。其他參數如工作型態、參數等。
- 做什麼 (WHAT)
SCHEDULER 可執行的包含有匿名 PL/SQL 區塊、STORED PROCEDURE,或甚至執行檔。
- 何時做 (WHEN)
- 型態(Job Type)
PLSQL_BLOCK(可為單一INSERT), STORED_PROCEDURE, EXECUTABLE, CHAIN (具備程式邏輯的一串 SCHEDULE)
- 開始日期時間、結束日期時間
- 執行頻率
- ENABLE
此參數必須設為 TRUE 才會啟動 (預設是 FALSE)
- AUTODROP
JOB 結束後是否自動刪除 JOB 的定義。預設是 TRUE
- CREATE PROGRAM
- CREATE SCHEDULE
以下使用其中一個定義來展示
PROCEDURE create_job(
job_name IN VARCHAR2,
job_type IN VARCHAR2,
job_action IN VARCHAR2,
number_of_arguments IN PLS_INTEGER DEFAULT 0,
start_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,
repeat_interval IN VARCHAR2 DEFAULT NULL,
end_date IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,
job_class IN VARCHAR2 DEFAULT 'DEFAULT_JOB_CLASS',
enabled IN BOOLEAN DEFAULT FALSE,
auto_drop IN BOOLEAN DEFAULT TRUE,
comments IN VARCHAR2 DEFAULT NULL,
credential_name IN VARCHAR2 DEFAULT NULL,
destination_name IN VARCHAR2 DEFAULT NULL);
SCHEDULER 的相關權限
由於 SCHEDULER 有可能執行匿名區塊、STORED PROCEDURE或是執行檔等,因此需要的相關權限如下
- CREATE JOB
- CREATE ANY JOB
- CREATE EXTERNAL JOB
- EXECUTE ANY PROGRAM
- EXECUTE ANY CLASS
- MANAGE SCHEDULE
- EXECUTE ON
- ALTER ON
- ALL ON
其中,角色 SCHEDULER_ADMIN 包含有前六項權限
SCHEDULER 的動態 VIEWS
user_scheduler_jobs 、 dba_scheduler_jobs 、 dba_jobs 或是 dba_jobs 等等
以下在 HR SCHEMA 下新增一TABLE,然後透過一分鐘執行一次的 JOB ,將系統時間INSERT到該新的TABLE
首先透過 SYSTEM 權限,授權 HR 。
grant create job to hr;
grant alter job to hr;
接下來登入 HR,建立 TABLE及 JOB
create table times (c1 date);
alter session set nls_date_format='dd-mm-yy hh24:mi:ss';
begin
dbms_scheduler.create_job
(
job_name=>'savedate',
job_type=>'plsql_block',
job_action=>'insert into times values(sysdate);',
start_date=>sysdate,
repeat_interval=>'freq=minutely;interval=1',
enabled=>true,
auto_drop=>false
);
end;
/
執行完畢後,透過動態 VIEWS ,查詢執行次數如下
select job_name, enabled, to_char(next_run_date, 'dd-mm-yy hh24:mi:ss'), run_count from user_scheduler_jobs;
透過DATABASE CONTROL新增SCHEDULER
在網頁中選擇伺服器==>排程==>程式==>新增 ,在所有欄位填入必要資訊後,選擇【顯示SQL】可看到該工作的對應SQL,如下圖
確定執行後可看到多了一筆排程
SCHEDULER 的LOGS
紀錄可透過下列兩個TABLES來取得,dba_scheduler_job_log 或 user_scheduler_job_log 。
select job_name, log_date, status from dba_scheduler_job_log ;
或是
select job_name, log_date, status from user_scheduler_job_log ;
以下透過HR帳號取得該帳號下的紀錄
以下則為管理者帳號所取得紀錄