Oracle Scheduler มีประโยชน์ในการกำหนดงานให้ทำแบบอัตโนมัติตามเวลาหรือเหตุการณ์ที่เราได้ตั้งไว้
และมันยังสามารถตั้งค่าให้งานนึงรันต่อจากอีกงานนึงก็ได้ (Job chain) อีกทั้งยังประยุกต์ใช้ร่วมกับ Resource Manager เพื่อกำหนด Priorities ต่างๆได้อีกด้วย
เราสามารถสร้าง Job ให้รันงานได้หลายประเภทเช่น PLSQL_BLOCK , STORED_PROCEDURE , หรือ EXECUTABLE
โดย PLSQL_BLOCK คือ SQL statement , PL/SQL anonymous block
STORED_PROCEDURE คือ stored procedure ซึ่งสามารถเป็น pl/sql , java หรือ external procedure ที่เขียนด้วย C
EXECUTABLE คือชุด OS command , executable binary file , หรือ shell script หรือ batch file
โดยเมื่อเรากำหนดประเภทของมันแล้วเราต้องกำหนด Action ให้ตรงกันด้วย
ตัวอย่างการสร้าง Job อย่างง่ายด้วย DBMS_SCHEDULER
1. สร้าง table ไว้เก็บวันที่และเวลา
create table num (c1 date);
2. ปรับรูปแบบวันที่ให้ดูนาทีได้
alter session set nls_date_format='dd-mm-yy hh24:mi:ss';
3. สร้าง job ขึ้นมาโดยสั่งให้ Insert วันที่กับเวลาลงใน TIMES table โดยให้ทำทุกๆ 1 นาที
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;
/
4. ลอง query ดู
select * from times;
C1
-----------------
28-03-15 22:48:57
28-03-15 22:49:57
28-03-15 22:50:57
5. เราสามารถยกเลิกและลบ JOB ของเราทิ้งได้ด้วย
exec dbms_scheduler.disable('savedate');
exec dbms_scheduler.drop_job('savedate');
เราสามารถสร้าง Program และ Schedule ขึ้นมาแล้วให้ JOB อื่นมาเรียก Program และ Schedule ของเราได้อีกหลายๆครั้ง เป็นการ Reuse Operation ได้โดยเรากำหนด Action ไว้ที่ Program และเวลาที่รันไว้ที่ Schedule แทน
ตัวอย่าง
1. สร้าง Program ขึ้นมาก่อน
begin
dbms_scheduler.create_program(
program_name=>'savedate',
program_action=>'insert into times values(sysdate);',
program_type=>'plsql_block',
comments=>'Insert current date into the TIMES table',
enabled=>true);
end;
/
NOTE : JOB และ PROGRAM แชร์ Namespace กันเราไม่สามารถสร้าง JOB และ PROGRAM มีชื่อเหมือนกันได้
2. สร้าง Schedule ขึ้นมาและกำหนดว่ารันทุก 3 นาที
begin
dbms_scheduler.create_schedule(
schedule_name=>'every_three_minute',
start_date=>sysdate,
repeat_interval=>'freq=minutely;interval=3',
comments=>'Every 3 minutes');
end;
/
3. สร้าง JOB ขึ้นมาแล้วสั่งให้ใช้ Program กับ Schedule ที่มีอยู่
begin
dbms_scheduler.create_job(
job_name=>'increase_date',
program_name=>'savedate',
schedule_name=>'every_three_minute',
enabled=>true,
auto_drop=>false);
end;
/
4. ลอง query ดู
select * from times;
C1
-----------------
28-03-15 23:05:07
28-03-15 23:08:07
28-03-15 23:11:07
28-03-15 23:14:07
ตัวอย่างที่ 2 สร้าง job เพื่อทำ begin backup และ end backup (สร้างบน SYS หรือ SYSTEM) โดยให้รันวันละ 1 ครั้งตามเวลาที่กำหนด
begin
dbms_scheduler.create_job(
job_name=>'begin_backup',
job_type=>'plsql_block',
job_action=>'begin
execute immediate ''alter database begin backup''; end;',
start_date=>to_date('17-JUL-2017 17:28:00','DD-MON-YYYY HH24:MI:SS'),
repeat_interval=>'freq=daily;interval=1',
enabled=>true,
auto_drop=>false);
end;
/
begin
dbms_scheduler.create_job(
job_name=>'end_backup',
job_type=>'plsql_block',
job_action=>'begin
execute immediate ''alter database end backup''; end;',
start_date=>to_date('17-JUL-2017 17:33:00','DD-MON-YYYY HH24:MI:SS'),
repeat_interval=>'freq=daily;interval=1',
enabled=>true,
auto_drop=>false);
end;
/
ตัวอย่างบางส่วนใช้จากหนังสือ OCP Oracle 11g Administration II Exam Guide