2012-09-22 74 views
2

我正在爲拍賣創建一個數據庫,其中存儲了用於拍賣的物品條目的表格。
在Oracle11g中自動執行任務

create table items(
item_ID number(5) PRIMARY KEY, 
SDate DATE NOT NULL, 
EDate DATE NOT NULL, //end date for auction 
minBid number(5,2) NOT NULL, 
bidInc number(2,2) NOT NULL, 
title varchar2(20) NOT NULL, 
descr varchar2(255), 
currentBid number(5,2) 
) 

現在的結束日期已過後,我希望數據庫自動從表中刪除該條目。
我該怎麼做?

+0

我做了一些窺探,我猜DBMS_SCHEDULER是wh在我尋找...所以有人可以解釋這個功能? –

回答

3

那麼,你可以在數據庫中寫一個工作,它會刪除比X時間更早的行,但是因爲你把它標記爲C#,我猜你希望它在你的拍賣應用程序中完成。

在這種情況下,您可以創建一個Timer,每運行一次該查詢就會運行一個DELETE FROM items WHERE EDate > XXX查詢。

編輯:在這種情況下,你可以定義一個存儲過程,將刪除舊行,然後你需要安排它與DBMS_JOB。我沒有一個Oracle DB手頭對此進行測試,但你可以嘗試運行此:

創建一個存儲過程:

create or replace procedure delete_old_auctions 
as 
begin 
    delete from items where edate < sysdate 
end; 

然後,你需要創建將執行此存儲過程的作業每X次。

dbms_job.submit(
    what=>'your_db.delete_old_auctions', 
    next_date=>sysdate+1/24, -- start next hour 
    interval=>'sysdate+1/24'); -- Run every hour 
+0

不,我想要數據庫本身來處理這個問題,而不是我的應用程序。不要誤解。 –

+0

在這種情況下,我更新了答案。不幸的是,我現在無法對此進行測試,但即使第一次嘗試不起作用,您也應該繼續下去。 – Artless

+0

非常感謝,像一個魅力工作!!!我會發布確切的解決方案。 –

2

所有那些被困在類似解決方案中的人都是這樣做的。

步驟1:創建過程

create procedure item_delete as 
begin 
delete from items where edate<sysdate 
end; 

步驟2:自動化使用DBMS_SCHEDULER

DBMS_SCHEDULER.create_job (
job_name  => 'delete_old_items', 
job_type  => 'STORED_PROCEDURE', 
job_action  => 'exec item_delete', 
start_date  => sysdate, 
repeat_interval => 'freq=daily; byhour=0;byminute=0;bysecond=0;', 
end_date  => NULL, 
enabled   => TRUE 
); 
END; 


引用
http://docs.oracle.com/cd/B19306_01/appdev .102/b14258/d_sched.htm#i1000363