1. 程式人生 > >Oracle定時任務小案例

Oracle定時任務小案例

需求簡述

一個數據表中包含此資料的錄入時間,此資料的初始狀態是有效,五天後系統自動置該資料的狀態為無效

方案

  1. 寫一個儲存過程,用於更新欄位(改狀態);
  2. 寫一個job,用於定時執行儲存過程;

方案邏輯

儲存過程

  1. 前提條件:此資料的狀態為有效狀態;
  2. 獲取當前系統時間;
  3. 獲取資料輸入時間;
  4. 計算二者差值;如果二者差值大於5,置資料狀態為無效,反之,不做操作。

Job

  1. 設定每天0:00自動執行儲存過程;(為了儘快看到測試結果,這裡設定時間為每分鐘執行一次job。)

測試小案例

  1. 建立表

    --建立表
    create table test(name varchar2(30), passwd varchar2(30),inputtime date,status
    varchar2(2));
  2. 插入資料

    --插入資料
    declare 
     c_name varchar2(30) := 'TestUser';
     c_pass varchar2(30) := 'TestPass';
     c_inputTime date;
     c_status varchar2(2) := '01';
    begin
      select sysdate into c_inputTime from dual;
     for i in 0..99 loop
       c_name := c_name || to_char(i);
       c_pass := c_pass || to_char(i);
       c_inputTime := c_inputTime-1
    ; dbms_output.put_line('name='||c_name||', passWd='||c_pass||', inputtime='||c_inputTime||' status='||c_status); insert into test (name,passwd,inputtime,status) values (c_name,c_pass,c_inputTime,c_status); c_name := 'TestUser'; c_pass := 'TestPass'; end loop; commit; end;
  3. 儲存過程

    --建立儲存過程,用於更新status
    create or replace procedure pro_test is begin declare NUM number :=5; d date; cursor cur_test is select name,inputtime,status from test where status='01' order by inputtime desc;--建立遊標,用於儲存結果集 begin select sysdate into d from dual;--獲取系統時間 for temp in cur_test loop if round(to_number(d-temp.inputtime))>NUM then update test set status='00' where name = temp.name;--更新表資料 end if; end loop; commit;--提交事務 end; end pro_test;
  4. 定時任務

    declare
    job_test number;
    begin
    dbms_job.submit(job_test, 'pro_test;',sysdate, 'sysdate+1/24/60');--每分鐘執行一次
    end;