oracle定時任務記錄
阿新 • • 發佈:2019-02-16
一、Oracle定時任務說明
注意:所有的指令碼都是在普通使用者賬號下登陸操作的(都是plsq的SQL視窗下執行的)。
1 建立分割槽表
create table vts_ais_history
(
id VARCHAR2(64) primary key not null,
lat NUMBER(10,4),
lot NUMBER(10,4),
mmsi VARCHAR2(32),
create_date DATE,
in_db_date DATE
)PARTITION BY RANGE (create_date)
INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
(PARTITION part1 VALUES LESS THAN (TO_DATE ('2016-01-01', 'yyyy-MM-dd')))
--建立全域性索引:
create index create_date_index on vts_ais_history (create_date)
2 建立儲存過程
create or replace procedure aish_proc_task
as name varchar2(64);count_n int;
begin
count_n:=0;
select count(*) into count_n
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
--dbms_output.put_line(count_n);
if count_n>0 then
--dbms_output.put_line('不為空1');
select subobject_name into name
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
if(name is not null) then
--dbms_output.put_line('結果:');
--dbms_output.put_line(name);
EXECUTE IMMEDIATE 'alter table vts_ais_history drop partition '||name||' UPDATE GLOBAL INDEXES';
end if;
--else
--dbms_output.put_line('為空');
end if;
end;
3 建立一個job作業,點選提交
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job, --任務名稱 ,--sys為管理員賬號名
'aish_proc_task;',--執行的過程
sysdate,--執行時間
'TRUNC(LAST_DAY(SYSDATE))+1+1/24');--每月1號的凌晨1點執行
end;
4 得到job的id
select * from user_jobs
執行該sql語句,得到job的id值。就是job值。
5 執行job
begin
dbms_job.run(25);--25為任務的job的id值。user_jobs的job欄位。
end;
6 刪除job,點選提交
begin
dbms_job.remove(25);--和select * from user_jobs; 中的job值對應,看what對應的儲存過程名稱
end;
!!!說明:
1 儲存過程中預設不容許執行alter table類似的sql語句。如果想要執行,通過execute immediate 'truncate table tablename';
如:
建立儲存過程:
create or replace procedure aish_proc_task
as name varchar2(64);count_n int;
begin
count_n:=0;
select count(*) into count_n
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
--dbms_output.put_line(count_n);
if count_n>0 then
--dbms_output.put_line('不為空1');
select subobject_name into name
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
if(name is not null) then
--dbms_output.put_line('結果:');
--dbms_output.put_line(name);
EXECUTE IMMEDIATE 'alter table vts_ais_history drop partition '||name||' UPDATE GLOBAL INDEXES';
end if;
--else
--dbms_output.put_line('為空');
end if;
end;
執行儲存過程:
begin
aish_proc_task;
end;
2 儲存過程中的select 。。結果集。如果結果集為空,則可以通過select count(*) into來進行判斷。
如上述的儲存過程。
3 執行alter table vts_ais_history drop partition ‘分割槽名稱’;sql語句後。再次插入時,會報索引不可用狀態。
解決方法:
將:alter table vts_ais_history drop partition ‘分割槽名稱’;
改為:
alter table vts_ais_history drop partition ‘分割槽名稱’ UPDATE GLOBAL INDEXES;
4 執行頻率改為每月1日凌晨1點執行 ,
TRUNC(LAST_DAY(SYSDATE))+1+1/24
如:
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job, --任務名稱 ,--sys為管理員賬號名
'aish_proc_task;',--執行的過程
sysdate,--執行時間
'TRUNC(LAST_DAY(SYSDATE))+1+1/24');--每月1日凌晨1點執行
end;
每1分鐘執行一次示例:
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job, --任務名稱 ,--sys為管理員賬號名
'aish_proc_task;',--執行的過程
sysdate,--執行時間
'SYSDATE+60/86400');
end;
注意:所有的指令碼都是在普通使用者賬號下登陸操作的(都是plsq的SQL視窗下執行的)。
1 建立分割槽表
create table vts_ais_history
(
id VARCHAR2(64) primary key not null,
lat NUMBER(10,4),
lot NUMBER(10,4),
mmsi VARCHAR2(32),
create_date DATE,
in_db_date DATE
)PARTITION BY RANGE (create_date)
INTERVAL ( NUMTOYMINTERVAL (1, 'MONTH') )
(PARTITION part1 VALUES LESS THAN (TO_DATE ('2016-01-01', 'yyyy-MM-dd')))
--建立全域性索引:
create index create_date_index on vts_ais_history (create_date)
2 建立儲存過程
create or replace procedure aish_proc_task
as name varchar2(64);count_n int;
begin
count_n:=0;
select count(*) into count_n
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
--dbms_output.put_line(count_n);
if count_n>0 then
--dbms_output.put_line('不為空1');
select subobject_name into name
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
if(name is not null) then
--dbms_output.put_line('結果:');
--dbms_output.put_line(name);
EXECUTE IMMEDIATE 'alter table vts_ais_history drop partition '||name||' UPDATE GLOBAL INDEXES';
end if;
--else
--dbms_output.put_line('為空');
end if;
end;
3 建立一個job作業,點選提交
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job, --任務名稱 ,--sys為管理員賬號名
'aish_proc_task;',--執行的過程
sysdate,--執行時間
'TRUNC(LAST_DAY(SYSDATE))+1+1/24');--每月1號的凌晨1點執行
end;
4 得到job的id
select * from user_jobs
執行該sql語句,得到job的id值。就是job值。
5 執行job
begin
dbms_job.run(25);--25為任務的job的id值。user_jobs的job欄位。
end;
6 刪除job,點選提交
begin
dbms_job.remove(25);--和select * from user_jobs; 中的job值對應,看what對應的儲存過程名稱
end;
!!!說明:
1 儲存過程中預設不容許執行alter table類似的sql語句。如果想要執行,通過execute immediate 'truncate table tablename';
如:
建立儲存過程:
create or replace procedure aish_proc_task
as name varchar2(64);count_n int;
begin
count_n:=0;
select count(*) into count_n
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
--dbms_output.put_line(count_n);
if count_n>0 then
--dbms_output.put_line('不為空1');
select subobject_name into name
from
(select * from user_objects where object_name='VTS_AIS_HISTORY'
and CREATED <= add_months(sysdate,-6)
and GENERATED ='Y' order by created asc)
where rownum=1;
if(name is not null) then
--dbms_output.put_line('結果:');
--dbms_output.put_line(name);
EXECUTE IMMEDIATE 'alter table vts_ais_history drop partition '||name||' UPDATE GLOBAL INDEXES';
end if;
--else
--dbms_output.put_line('為空');
end if;
end;
執行儲存過程:
begin
aish_proc_task;
end;
2 儲存過程中的select 。。結果集。如果結果集為空,則可以通過select count(*) into來進行判斷。
如上述的儲存過程。
3 執行alter table vts_ais_history drop partition ‘分割槽名稱’;sql語句後。再次插入時,會報索引不可用狀態。
解決方法:
將:alter table vts_ais_history drop partition ‘分割槽名稱’;
改為:
alter table vts_ais_history drop partition ‘分割槽名稱’ UPDATE GLOBAL INDEXES;
4 執行頻率改為每月1日凌晨1點執行 ,
TRUNC(LAST_DAY(SYSDATE))+1+1/24
如:
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job, --任務名稱 ,--sys為管理員賬號名
'aish_proc_task;',--執行的過程
sysdate,--執行時間
'TRUNC(LAST_DAY(SYSDATE))+1+1/24');--每月1日凌晨1點執行
end;
每1分鐘執行一次示例:
declare
tm_job number;
begin
sys.dbms_job.submit(tm_job, --任務名稱 ,--sys為管理員賬號名
'aish_proc_task;',--執行的過程
sysdate,--執行時間
'SYSDATE+60/86400');
end;