Scheduler event in Oracle - oracle

I have an event scheduler in mysql which is executing fine
CREATE event 'STORE' ON schedule every 1 hour doUPDATE c_store
SET is_active = '0'
WHERE web_id =
(
SELECT web_id
FROM c_web
WHERE Datediff(Now( ) , createdon ) > 15)
My query is i want the same in Oracle , can any one guide me.

You need to use DBMS_SCHEDULER to create a job and schedule it to run hourly.
For example,
SQL> BEGIN
2 DBMS_SCHEDULER.DROP_JOB (JOB_NAME => 'test_full_job_definition');
3 END;
4 /
PL/SQL procedure successfully completed.
SQL>
SQL> BEGIN
2 DBMS_SCHEDULER.create_job (
3 job_name => 'test_full_job_definition',
4 job_type => 'PLSQL_BLOCK',
5 job_action => 'BEGIN my_job_procedure; END;',
6 start_date => SYSTIMESTAMP,
7 repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
8 end_date => NULL,
9 enabled => TRUE,
10 comments => 'Job defined entirely by the CREATE JOB procedure.');
11 END;
12 /
PL/SQL procedure successfully completed.
SQL>
SQL> SELECT JOB_NAME, ENABLED FROM DBA_SCHEDULER_JOBS where job_name ='TEST_FULL_JOB_DEFINITION'
2 /
JOB_NAME ENABL
---------------------------------------- -----
TEST_FULL_JOB_DEFINITION TRUE
SQL>
See more examples here

You must use DBMS_SCHEDULER
Here you can find some examples.

Related

How to alter oracle job to run every 12hrs

I need below job to be run at every 12 hrs (example : job need to be run daily at 12:30am & 12:30pm) please someone help
Code :
BEGIN
SYS.DBMS_JOB.CHANGE
(
job => 123
,what => 'SP_ABC;'
,next_date => TO_DATE('08/09/2020 00:30:00','dd/mm/yyyy hh24:mi:ss')
,INTERVAL => 'TRUNC(sysdate+1)+30/1440'
);
END;
/
COMMIT;
That would be something like this:
SQL> set serveroutput on
SQL> declare
2 l_job number;
3 begin
4 dbms_job.submit
5 (job => l_job,
6 what => 'p_test;',
7 next_date => trunc(sysdate + 1) + 0/24 + 30/(24*60),
8 interval => 'trunc(sysdate + 1) + 12/24 + 30/(24*60)'
9 );
10 commit;
11 dbms_output.put_line('job number = ' || l_job);
12 end;
13 /
job number = 151
PL/SQL procedure successfully completed.
SQL> select job, last_date, next_date from user_jobs;
JOB LAST_DATE NEXT_DATE
---------- ------------------- -------------------
151 08.09.2020 00:30:00
SQL>
Or, if you switch to DBMS_SCHEDULER:
SQL> begin
2 sys.dbms_scheduler.create_job
3 (job_name => 'test',
4 job_type => 'plsql_block',
5 job_action => 'begin p_test; end;',
6 start_date => sysdate,
7 repeat_interval => 'freq=daily; byhour=0,12; byminute=30',
8 enabled => true
9 );
10 end;
11 /
PL/SQL procedure successfully completed.
SQL> select repeat_interval, next_run_date from user_scheduler_jobs;
REPEAT_INTERVAL NEXT_RUN_DATE
---------------------------------------- ----------------------------------------
freq=daily; byhour=0,12; byminute=30 08.09.20 00:30:05,000000 +02:00
SQL>

DBMS_SCHEDULER in apex oracle

I have an API package written. It has the GET_INFO procedure. I want this procedure to be performed in the background every 20 minutes. I understand what I should do with dbms_scheduler. But in general I do not understand where to register them . I will be grateful for the example or for your help with this)
I wrote such a code but I don't know where to use it:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name = 'My_Job',
job_type = 'STORED_PROCEDURE',
job_action = 'INSERT INTO TEST2(UPDATEDAT)
VALUES (sysdate);
END;',
start_date = 'systimestamp',
repeat_interval = 'FREQ=SECONDLY;INTERVAL=5',
end_date = null,
auto_drop = FALSE,
comments = 'My new job');
END;
Here is my code and I don't know where to store it.
As the job type implies, you need a procedure to be created such as
create or replace procedure Ins_Test2 is
begin
insert into Test2(updatedat) values(sysdate);
commit;
end;
and then create the scheduler through
begin
dbms_scheduler.create_job (
job_name => 'My_Job',
job_type => 'STORED_PROCEDURE',
job_action => 'Ins_Test2',
start_date => systimestamp,
repeat_interval => 'freq=minutely; interval = 20; byday=MON,TUE,WED,THU,FRI;',
enabled => true,
comments => 'My new job'
);
end;
where I added
byday=MON,TUE,WED,THU,FRI; as an extra direction if you want to run
the scheduler within the working days(you can omit that part if you'd
like).
systimestamp(get rid of quotes) for start_date might be
replaced with an upcoming time info such as start_date => '13-FEB-20 2.00.00PM Asia/Istanbul'
in my case.
And follow by listing the created schedulers by
select job_name, next_run_date
from dba_scheduler_jobs j;
And currently running ones by
select *
from user_scheduler_job_log l
order by l.log_date desc;
And drop the scheduler by
begin
dbms_scheduler.drop_job( job_name => 'My_Job' );
end;

How to rename scheduler job Oracle

I would like rename scheduler job in Oracle, is it possible?
dba_scheduler_jobs(owner = "db", name = "my_job")
=> dba_scheduler_jobs(owner = "db", name = "my_own_job");
Thanks for answers.
A job is a database object, so the RENAME command works natively
SQL> begin
2 dbms_scheduler.create_job (
3 job_name => 'MY_BAD_NAME',
4 job_type => 'PLSQL_BLOCK',
5 job_action => 'begin null; end;',
6 start_date => systimestamp,
7 repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
8 enabled => true);
9 end;
10 /
PL/SQL procedure successfully completed.
SQL> rename MY_BAD_NAME to BETTER_NAME;
Table renamed.
SQL> select job_name from user_scheduler_jobs;
JOB_NAME
--------------------------------------------------------------------------------
BETTER_NAME
Instead of rename, you can create/replicate job and drop the old one.
Below, my_new_job1 has created.
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_new_job1',
program_name => 'my_saved_program',
repeat_interval => 'FREQ=DAILY;BYHOUR=12',
comments => 'Daily at noon');
END;
/
Below, my_new_job2 has created with same details as my_new_job1
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_new_job2',
program_name => 'my_saved_program',
repeat_interval => 'FREQ=DAILY;BYHOUR=12',
comments => 'Daily at noon');
END;
/
Below an old job my_new_job1 has been deleted.
BEGIN
DBMS_SCHEDULER.DROP_JOB ('my_new_job1');
END;
/

Create backup tables periodically

I want to take a backup of two of my tables in Oracle Database. The backup should happen on each 15 days i.e. on 1st and 15th of each month.
Is there any way to automate this in Oracle through a procedure ?
Currently I do it may manually running a create table xxx_DDMM as select * from xxx;
Yes, you can schedule periodic jobs with Oracle Scheduler. Sample example:
--Create job.
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'BACKUP_TABLE',
job_type => 'PLSQL_BLOCK',
job_action =>
q'[
begin
execute immediate 'create table xxx_'||to_char(sysdate, 'DDMM')||' as select * from xxx';
end;
]',
repeat_interval => 'FREQ=DAILY;BYMONTHDAY=1,15;BYHOUR=8;BYMINUTE=0;',
enabled => true);
END;
/
--Test and monitor job:
begin
dbms_scheduler.run_job('BACKUP_TABLE');
end;
/
select * from dba_scheduler_jobs where job_name = 'BACKUP_TABLE';
select * from dba_scheduler_job_run_details where job_name = 'BACKUP_TABLE' order by log_date;

Oracle Scheduler proc doesn't complete before next start time

I want to know what will happen if a scheduler takes more than hour to complete but the scheduler is configured to re-run for every hour. Would it create multiple running sessions or would it wait for the previous run to complete?
It will wait. I'll start this job every minute, but it takes 2 mins to run
SQL> create table t ( tag varchar2(10), d date);
Table created.
SQL>
SQL> create or replace
2 procedure P is
3 begin
4 insert into t values ('start',sysdate);
5 commit;
6 dbms_lock.sleep(120);
7 insert into t values ('end',sysdate);
8 commit;
9 end;
10 /
Procedure created.
SQL>
SQL> begin
2 dbms_scheduler.create_job (
3 job_name => 'JOB1',
4 job_type => 'PLSQL_BLOCK',
5 job_action => 'begin p; end;',
6 start_date => systimestamp,
7 repeat_interval => 'freq=minutely;bysecond=0;',
8 enabled => true);
9 end;
10 /
PL/SQL procedure successfully completed.
SQL> select * from t;
TAG D
---------- -------------------
start 03/05/2018 22:47:00
end 03/05/2018 22:49:00
start 03/05/2018 22:49:00

Resources