2012-10-04 88 views
1

我之前沒有編寫過任何MySql存儲過程,所以我根本不知道它們。我有一個數據庫表,裏面有一些記錄。主列是dateTime - 此記錄保存在數據庫中時。MySql存儲過程更新數據庫記錄

我已經寫的MySQL存儲過程來選擇指定日期每一條記錄:

CREATE PROCEDURE getMessages(IN dateFrom DATETIME) 
    SELECT * FROM EsbMessage WHERE dateTime <= dateFrom; 

這是召喚:

CALL getMessages('2012-10-04 13:11:09'); 

這正常工作,它返回我從記錄指定的日期。

我需要做的是:

  1. 如果記錄是一個多星期的時候,我需要更新其他 列。
  2. 如果記錄超過一年,我需要刪除該記錄。

我可以很容易地做到這一點編程,但在這種情況下,我必須使用存儲過程來做到這一點。

的東西

所以我'的思維是這樣的:

CREATE PROCEDURE updateMessages(IN dateFrom DATETIME) 
    BEGIN 
     SELECT * FROM EsbMessage WHERE dateTime <= dateFrom; 
     #for each message 
     #if the message is over one week old but not over one year old: 
     UPDATE EsbMessage SET body = ''; 
     #if message is over one year old: 
     DELETE FROM EsbMessage WHERE dateTime = #message.dateTime 
END 

但我不知道如何在存儲過程中使用的循環,以及如何在根據我的要求語句編寫和其他的事情我現在沒有如何計算MySql中的日期。對於例如如果我有當前日期,那麼我需要從當前日期減去365天。

有人可以幫我解決這個問題嗎?

回答

0

如何循環和if引導的從句這裏描述的使用方法:http://www.mysqltutorial.org/stored-procedures-loop.aspx

我會做不循環:

CREATE PROCEDURE updateMessages(IN dateFrom DATETIME) 
BEGIN  
    UPDATE EsbMessage SET body = '' where dateTime <= dateFrom -(86400*7); //86400 = 1 day 
    #if message is over one year old: 
    DELETE FROM EsbMessage where dateTime <= dateFrom -(86400*365); 
END 
+1

閏秒和年? :-) –

+0

;-)我太懶惰了 – Hache

1

你不會需要一個循環,只要有你的條件在WHERE子句中:

#if the message is over one week old but not over one year old: 
UPDATE EsbMessage SET body = '' 
WHERE dateTime >= DATE_SUB(NOW(),INTERVAL 1 WEEK) AND dateTime <= DATE_SUB(NOW(),INTERVAL 1 YEAR); 

#if message is over one year old: 
DELETE FROM EsbMessage WHERE dateTime >= DATE_SUB(NOW(),INTERVAL 1 YEAR);