HOW TO CREATE A SCHEDULER JOB IN ORACLE 12C
 
RELATED BOOK
Oracle 12c For Dummies
By Chris Ruel, Michael Wessler
The Oracle 12c Scheduler example here creates a simple job that runs a stored Programming Language/Structured Query Language (PL/SQL) procedure. The procedure selects a count of the number of users on the system and inserts that number into a table with a timestamp. It runs every five minutes.
Follow these steps to schedule a job for the first time:
Log in to SQL*Plus as the SYS user.
Give the intended job creator the ability to create jobs:
<grant create job to hr;>
You should see this:
Grant succeeded.
This example job is created and run by HR.
Let HR see the V$SESSION table:
<grant select on v_$session to hr;>
You should see this:
Grant succeeded.
The _ in V_$SESSION isn’t a typo! V$SESSION is a synonym for V_$SESSION. For the grant to work, you have to give the view name.
Log in to SQL*Plus as the job creator and make a table to hold the data:
< create table user_count (
number_of_users NUMBER(4),
time_of_day   TIMESTAMP
)
TABLESPACE users;>
You see this:
Table created.
Create a stored procedure:
< CREATE OR REPLACE PROCEDURE insert_user_count AS
  v_user_count NUMBER(4);
BEGIN
 SELECT count(*)
      INTO v_user_count
   FROM v$session
   WHERE username IS NOT NULL;
  INSERT INTO user_count
   VALUES (v_user_count, systimestamp);
  commit;
END insert_user_count;
/ >
The stored procedure gathers the number of users and inserts them into the table with a timestamp. You should see this:
Procedure created.
Create a program for the job:
< BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM (
  program_name      => 'PROG_INSERT_USER_COUNT',
program_action     => 'INSERT_USER_COUNT',
program_type      => 'STORED_PROCEDURE');
END;
/>
You see this:
PL/SQL procedure successfully completed.
Enable the program:
<exec dbms_scheduler.enable('PROG_INSERT_USER_COUNT')>
You see this:
PL/SQL procedure successfully completed.
Create a schedule for the job to run:
< BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE (
 schedule_name   => 'my_weekend_5min_schedule',
 start_date    => SYSTIMESTAMP,
 repeat_interval  => 'FREQ=MINUTELY; INTERVAL=5; BYDAY=SAT,SUN',
 end_date     => SYSTIMESTAMP + INTERVAL '30' day,
 comments     => 'Every 5 minutes');
END;
/>
This example job runs every five minutes. You see this:
PL/SQL procedure successfully completed.
Create your job with the program and schedule you defined:
< BEGIN
DBMS_SCHEDULER.CREATE_JOB (
  job_name     => 'my_user_count_job',
  program_name   => 'prog_insert_user_count',
  schedule_name   => 'my_weekend_5min_schedule');
END;
/>
You see this:
PL/SQL procedure successfully completed.
Enable your job so it runs within the defined schedule:
< exec dbms_scheduler.enable('my_user_count_job’)>
You see this:
PL/SQL procedure successfully completed.
The job runs at the specified start time (at SYSTIMESTAMP). If you choose a calendar date in the future, it doesn’t start until then.
After the job’s been running for 17 minutes, type the following to see your USER_COUNT table:
< select *
from user_count;>
You see this:
NUMBER_OF_USERS TIME_OF_DAY
--------------- ---------------------------------
       14 09-AUG-13 02.15.14.118495 PM
       14 09-AUG-13 02.00.14.137300 PM
       13 09-AUG-13 02.05.14.120116 PM
       13 09-AUG-13 02.10.14.120680 PM
When you have the job running, you can get details about the success or failure by querying the following views:
USER_SCHEDULER_JOB_RUN_DETAILS
USER_SCHEDULER_JOB_LOG
These views show information only about your jobs. To get information on the recent runs of our job, log in as the job creator and type
< select job_name, status, run_duration, cpu_used
from USER_SCHEDULER_JOB_RUN_DETAILS
where job_name = ‘MY_USER_COUNT_JOB’;>
You see this:
JOB_NAME       STATUS   RUN_DURATION  CPU_USED
-------------------- ---------- --------------- ------------------
MY_USER_COUNT_JOB  SUCCEEDED +000 00:00:00  +000 00:00:00.01
MY_USER_COUNT_JOB  SUCCEEDED +000 00:00:00  +000 00:00:00.01
MY_USER_COUNT_JOB  SUCCEEDED +000 00:00:00  +000 00:00:00.00
MY_USER_COUNT_JOB  SUCCEEDED +000 00:00:00  +000 00:00:00.01