2013-07-25 38 views
0

朋友和PL/SQL的大師......棘手PLSQL過程刪除數據

我想創建步驟刪除審計表中的數據,但不知道從哪裏開始..

它將是巨大的,如果有人能提供一些提示或指針...

要求:

  1. 程序將在每月的第一個星期六(不知道跑是有可能通過PL/SQL或個人有T o創建單獨的工作)

  2. 從週一到週六刪除2個月以前的數據,日期不應該是該月的第一天。 (即,假期週日&月的第一月數據超過2個月)

例如

*Procedure delete_log 

IS 

BEGIN 


delete from audit_logs 
where created >= trunc(sysdate - 60) and created < trunc(sysdate) 
and created != (Sunday) 
and created != (First of the month); 

Commit; 

End delete_log;* 

我沒有與PL/SQL,因此所有的技巧都讚賞了豐富的經驗..

謝謝, 邁克

回答

2

要安排你可以在服務器上使用cron作業的作業水平或Oracle調度運行的任務http://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse002.htm#i1006395

像這樣的東西會工作:

CREATE OR REPLACE PROCEDURE delete_log 
IS 
BEGIN 
    DELETE FROM audit_logs 
     WHERE  TRUNC (created) < ADD_MONTHS (TRUNC (SYSDATE), -2) 
       AND TO_CHAR (TRUNC (created), 'DY') != 'SUN' 
       AND TO_CHAR (TRUNC (created), 'DD') != '01'; 
END; 
/
+0

謝謝...我將測試這一點,並讓你知道know..just我們可以TO_CHAR用戶和TRUNC在相同的語法? – Khallas301

+0

是的,這是有效的語法。 – verbanicm

1

DBMS_Scheduler日曆語法將支持在該月的第一個星期六運行進程。

語法將是這樣的:

'FREQ=MONTHLY; BYDAY=SAT; BYSETPOS=1' 

你想補充條款在您希望它運行的確切時間。

'FREQ=MONTHLY; BYDAY=SAT; BYHOUR=3; BYMINUTE=30; BYSECOND = 0; BYSETPOS=1' 

至於刪除來講:

delete from audit_logs 
where created     < add_months(trunc(sysdate,'MM'),-2) and 
     to_char(created,'DY')  != 'SUN'        and 
     extract(DAY from created) != 1; 
+0

David ...爲什麼我們在創建時使用+1?我以爲只有-2會做.. – Khallas301

+0

啊,因爲這個月的第一天是要排除的;) –

+0

所以回答提供者@verbanicm會做什麼?還是需要+1? – Khallas301