কোন একটা প্রোগ্রাম/কাজ একটা নির্দিষ্ট সময় পর পর স্বয়ংক্রিয় ভাবে চালাতে DBMS_SCHEDULER প্যাকেজ ব্যাবহার করা হয়। যেমনঃ দিন শেষে আপনার একটা টেবিল উপডেট করতে হয় অথবা মাস শেষে স্যালারি টেবিল উপডেট করতে হয়। এ সব কাজ স্বয়ংক্রিয় ভাবে করতে আমরা DBMS_SCHEDULER প্যাকেজ ব্যাবহার করি।

এ জন্য প্রথমেই আপনার প্রয়োজনীয় প্রোগ্রামটা তৈরি করে নিন। মনে করি আপনার salary_update_pro নামে একটা প্রসিডিউর আছে যেটা প্রতিদিন রাত 12:00 মিনিটে উপডেট করতে হয়। তাহলে আমি নিচের মত করে একটা জব তৈরি করব।

BEGIN 
    DBMS_SCHEDULER.create_job ( 
        job_name => 'test_full_job_definition', 
        job_type => 'PLSQL_BLOCK', 
        job_action => 'BEGIN salary_update_pro; END;', 
        start_date => SYSTIMESTAMP, 
        end_date => null, 
        repeat_interval => 'freq=daily; byhour=0; byminute=0; bysecond=0;',
        enabled => TRUE, 
        comments => 'Job defined entirely by the CREATE JOB procedure.'); 
END;

প্যারামিটারঃ
job_name: যে জবটা তৈরি করছেন তার একটা মিনিংফুল নাম। যাতে পরে নাম দেখেই বুঝা যায় একটা কি সম্পর্কিত জব।
job_type: কি ধরনের প্রোগ্রাম রান করবে তার টাইপ।
job_action: যে প্রোগ্রামটা রান করবে তা এখানে স্পেসিফায় করতে হবে।
start_date: জবটা কখন থেকে রান করবে তা এখানে টাইমস্ট্যাম্প ফরমেটে দিতে হবে।
repeat_interval: কত সময় পর পর রান করবে তা এখানে সেট করে দিতে হবে।
end_date: জবটা যদি একটা নির্দিষ্ট সময় বন্ধ করে দিতে চান তাহলে এখানে টাইমস্ট্যাম্প ফরমেটে দিতে হবে।
enabled: জব এনাবল না ডিজেবল।
comments: জব সম্পর্কিত কোন মন্তব্য থাকলে তা এখানে দিবেন।

repeat_interval: প্যারামিটারগুলোর মধ্যে সবচেয়ে important হল repeat_interval কেননা এর উপর ডিপেন্ড করে আপনার প্রোগ্রাম রান করবে। বিভিন্ন হতে পারে যেমনঃ daily, weekly, minutely, hourly etc.
syntax

repeat_interval = frequency_clause
    [; interval=?] [; bymonth=?] [; byweekno=?]
    [; byyearday=?] [; bymonthday=?] [; byday=?]
    [; byhour=?] [; byminute=?] [; bysecond=?]

frequency_clause = "FREQ" "=" frequency 
    frequency = "YEARLY" | "MONTHLY" | "WEEKLY" | "DAILY"
    | "HOURLY" | "MINUTELY" | "SECONDLY"

Example:
Everyday mid night:

'freq=daily; byhour=0; byminute=0; bysecond=0;'

Every hour:

'freq=hourly; byminute=0; bysecond=0;'

Every minute:

'freq=minutely; bysecond=0;'

Every 5 minute:

'freq=minutely; interval=5; bysecond=0;'

Every Monday at 09:00:

'freq=weekly; byday=mon; byhour=9; byminute=0; bysecond=0;'

Every Monday, Wednesday and Friday at 06:00:

'freq=weekly; byday=mon,wed,fri; byhour=6; byminute=0; bysecond=0;'

একটা জব ক্রিয়েট করার সাথে সাথে সেটা চলতে থাকে। তবে আপনি ইচ্ছা করলে stop_job এবং run_job এর মাধ্যমে বন্ধ অথবা চালু করতে পারেন।
example

BEGIN 
    -- Run job synchronously. 
    DBMS_SCHEDULER.run_job (job_name => 'test_full_job_definition',
        use_current_session => TRUE); 
    
    -- Stop jobs. 
    DBMS_SCHEDULER.stop_job (job_name => 'test_full_job_definition,
        test_prog_sched_job_definition'); 
END

ড্রপ জবঃ কোন জব মুছে ফেলতে ড্রপ জব কমান্ড ব্যাবহার হয়।

BEGIN 
    DBMS_SCHEDULER.drop_job (job_name => 'test_sched_job_definition'); 
END;

ভিউইং এক্সিস্টিং জবঃ জব সম্পর্কিত সমস্ত ডাটা DBA_SCHEDULER_JOBS, ALL_SCHEDULER_JOBS এবং USER_SCHEDULER_JOBS এই তিনটা ভিউ-এ থাকে। আপনার প্রয়োজন অনুযায়ী উপরোক্ত ভিউ থেকে কুয়েরি করে দেখতে পারেন।

এই হল DBMS_SCHEDULER নিয়ে বেসিক কথা বার্তা। আপনি চাইলে DBMS_SCHEDULER দিয়ে আরও কমপ্লেক্স কাজ করতে পারেন, বিস্তারিত দেখুন Oracle Doc -এ।