1. 程式人生 > >oracle定時任務記錄

oracle定時任務記錄

一、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;