Oracle定时任务Job笔记
定时任务应用场景:
某一个生产系统上面,临时表不断变多,占了不少磁盘空间。由于这套软件是直接买的,不方便修改源代码。所以考虑使用Oracle定时任务直接从数据库层删除临时表。
定时任务业务:
首先写好一个存储过程。读当前用户所有以tempXXXXX开头的临时表,然后依次删除所有的临时表。然后在建立Oracle Job每天晚上定时调用这个存储过程。
存储过程代码:
create or replace PROCEDURE KDDROPTEMPTABLE AS
BEGIN
declare
cursor c_usertable is
select table_name from user_tables t where t.TABLE_NAME like ‘TEMPTABLE0000%’ and status = ‘VALID’;
my_tablename user_tables.table_name%TYPE;
v_sql varchar2(200);
v_count integer := 0;
begin
–DBMS_OUTPUT.ENABLE(buffer_size => null);
open c_usertable;
loop
–提取一行数据到c_usertable
fetch c_usertable into my_tablename;
exit when c_usertable%notfound;
v_sql := ‘drop table ‘||my_tablename;
execute immediate v_sql;
v_count := v_count+1;
— dbms_output.put_line(v_sql);
end loop;
–关闭游标
close c_usertable;
dbms_output.put_line(‘总工删除的临时表数量:’||v_count);
end;
END KDDROPTEMPTABLE;
Oracle定时任务建立步骤
Oracle有两种语法可以建定时任务,目前建议的是下面这种。老的方式已经不在建议使用。
如果你有Oracle SQL developer可以用界面新建
以下是通过SQL直接建Job:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => ‘”ZSNC57″.”autoDeleteTemp”‘,
job_type => ‘STORED_PROCEDURE’,
job_action => ‘ZSNC57.KDDROPTEMPTABLE’,
number_of_arguments => 0,
start_date => TO_TIMESTAMP_TZ(‘2018-09-12 14:41:09.000000000 ASIA/SHANGHAI’,’YYYY-MM-DD HH24:MI:SS.FF TZR’),
repeat_interval => ‘FREQ=DAILY;BYHOUR=14;BYMINUTE=45;BYSECOND=0’,
end_date => NULL,
enabled => FALSE,
auto_drop => TRUE,
comments => ‘自动删除临时表’);
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => ‘”ZSNC57″.”autoDeleteTemp”‘,
attribute => ‘restartable’, value => TRUE);
DBMS_SCHEDULER.SET_ATTRIBUTE(
name => ‘”ZSNC57″.”autoDeleteTemp”‘,
attribute => ‘logging_level’, value => DBMS_SCHEDULER.LOGGING_FULL);
DBMS_SCHEDULER.enable(
name => ‘”ZSNC57″.”autoDeleteTemp”‘);
END;
直接运行定时任务的方式:
begin
dbms_scheduler.run_job(‘autoDeleteTemp’,TRUE); — true代表同步执行
end;
注:如果直接执行Job可以执行,但定时定时执行却执行不了,很有可能是下面的语句没有执行:
grant create job to 用户名;
alter system set job_queue_processes = 1;
如果你的Job正常运行了,通过如下几张表可以查询到运行记录:
–Oracle定时任务
— job信息
select * from user_scheduler_jobs;
— job日志
select * from User_Scheduler_Job_Log;
— job运行日志
select * from user_scheduler_job_run_details;
–正在运行的job
select * from user_scheduler_running_jobs;
在Oracle SQL developer中也有集成界面