需求簡述 一個數據表中包含此數據的錄入時間,此數據的初始狀態是 有效 ,五天後系統自動置該數據的狀態為 無效 。 方案 1. 寫一個存儲過程,用於更新欄位(改狀態); 2. 寫一個job,用於定時執行存儲過程; 方案邏輯 存儲過程 1. 前提條件:此數據的狀態為 有效 狀態; 1. 獲取當前系統時間 ...
需求簡述
一個數據表中包含此數據的錄入時間,此數據的初始狀態是有效,五天後系統自動置該數據的狀態為無效。
方案
- 寫一個存儲過程,用於更新欄位(改狀態);
- 寫一個job,用於定時執行存儲過程;
方案邏輯
存儲過程
- 前提條件:此數據的狀態為有效狀態;
- 獲取當前系統時間;
- 獲取數據輸入時間;
- 計算二者差值;如果二者差值大於5,置數據狀態為無效,反之,不做操作。
Job
- 設置每天0:00自動執行存儲過程;(為了儘快看到測試結果,這裡設置時間為每分鐘執行一次job。)
測試小案例
創建表
--創建表 create table test(name varchar2(30), passwd varchar2(30),inputtime date,status varchar2(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;
存儲過程
--創建存儲過程,用於更新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;
定時任務
declare job_test number; begin dbms_job.submit(job_test, 'pro_test;',sysdate, 'sysdate+1/24/60');--每分鐘執行一次 end;