1

私はこれまでMySqlストアド プロシージャを作成したことがないので、まったく知りません。いくつかのレコードを含むデータベーステーブルが 1 つあります。主な列はdateTime- このレコードがデータベースに保存された日時です。

指定された日付からすべてのレコードを選択する MySql ストアド プロシージャを作成しました。

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

そして、これは呼び出しです:

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

これは正しく機能し、指定された日付からのレコードが返されます。

私がする必要があるのは:

  1. レコードが 1 週間以上経過している場合は、他の列を更新する必要があります。
  2. 記録が 1 年以上経過している場合は、その記録を削除する必要があります。

これはプログラムで簡単に実行できますが、この場合はストアド プロシージャを使用して実行する必要があります。

そこで、次のようなことを考えています。

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

しかし、ストアド プロシージャで for ループを使用する方法と、要件に応じて if ステートメントを記述する方法と、MySql で日付をカウントする方法がわかりません。たとえば、現在の日付がある場合、現在の日付から 365 日を引く必要があります。

誰かがこの問題について私を助けてくれますか?

4

2 に答える 2

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);
于 2012-10-04T12:53:26.517 に答える
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
于 2012-10-04T12:53:58.427 に答える