2010-11-18 17 views
3

私は自分のSQLの変更をすべていくつかのデータベースにマージして、タイムスタンプを使ってどの変更がすでに更新されているかを判断できるMySQL更新スクリプトを作成しています。MySQL IF文 - エラーが発生したスクリプト

@cvをデータベースの現在のバージョンに設定しました。この問題はif statementで発生します。私がIF文を変更した場合、それが転倒する原因となります。

SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDate'); 

IF @cv <= STR_TO_DATE("2010/11/10 12:15:00") THEN 
    ALTER TABLE `feeds` ADD `tone` VARCHAR(255) NOT NULL AFTER `type` , 
    ADD `authority` DECIMAL(2, 1) NOT NULL DEFAULT '0.0' AFTER `tone`; 
END IF; 

UPDATE `configs` SET `value` = NOW() WHERE `name` = "cvDate"; 

私は取得していますエラーは次のとおりです。

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF @cv <= STR_TO_DATE("2010/11/10 12:15:00") THEN ALTER TABLE `feeds` ADD `to' at line 1 

任意の助けをいただければ幸いです。

+0

@cvはただ1つの結果値であるか、それとも "結果セット"ですか、ただ1つの行と1つの要素を選択しても、おそらく@cvは同等の値ではなく全体の結果になりますか?私はちょうど脳を襲っているので、これをしなかった – Tobias

+0

'タイプ'の列はまだ存在しないので、変更テーブルの2番目の句を検証できない可能性はありますか?あるいは、Alter Table句を削除してIFを残すとどうなりますか? –

答えて

3

問題が

... IF制御フロー構築物が唯一ただ、他のすべての Flow Control Constructsのように(ストアド・プロシージャで動作します...だから、あなたが求めているものを行うための手順を定義する必要があるだろうということです

は、だからここにあなたがやりたいために、サンプル手順を定義する方法は次のとおりです。

DELIMITER // 
CREATE PROCEDURE myProcedure() 
BEGIN 
    SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDate'); 

    IF @cv <= STR_TO_DATE("2010/11/10 12:15:00") THEN 
     ALTER TABLE `feeds` ADD `tone` VARCHAR(255) NOT NULL AFTER `type` , 
      ADD `authority` DECIMAL(2, 1) NOT NULL DEFAULT '0.0' AFTER `tone`; 
    END IF; 

    UPDATE `configs` SET `value` = NOW() WHERE `name` = "cvDate"; 
END// 
DELIMITER ; 

それが作成されること、そしてそれを実行するために、ちょうど行います

CALL myProcedure(); 

詳細はthe docsを参照してください。

実際にはパラメータを取るようにして、すべてをハードコードする必要はありません。しかし、私はあなたが提供したものに基づいてそれをどうやって行うのかはわかりません。(正確に何を達成しようとしているのか分かりません)...

SQLステートメントを(Prepared Statementsを使用して)パラメータ:次に

DELIMITER // 
CREATE PROCEDURE myInputProcedure(IN updateDate DATETIME, IN sql TEXT) 
BEGIN 
    SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDate'); 

    IF @cv <= updateDate THEN 
     PREPARE stmt1 FROM sql; 
     EXECUTE stmt1; 
    END IF; 

    UPDATE `configs` SET `value` = NOW() WHERE `name` = "cvDate"; 
END// 
DELIMITER ; 

、単にこのようにそれを呼び出す:

...

@sql = 'ALTER TABLE `feeds` ADD `tone` VARCHAR(255) NOT NULL AFTER `type` , 
      ADD `authority` DECIMAL(2, 1) NOT NULL DEFAULT '0.0' AFTER `tone`;'; 
@date = STR_TO_DATE("2010/11/10 12:15:00"); 
CALL myInputProcedure(@date, @sql); 

(彼らは必要ありませんので、私は読みやすくするため@sql@dateを追加したことに注意してください)

+0

-1を説明するのに気をつけますか? – ircmaxell

+0

私は+1を行い、誰がマイナス-1をしたのかわからない。 OPに非常に簡単なストアドプロシージャの例を付けることができますか? – Lizard

+0

ニースは非常に便利です! – Lizard

-2

これを試してみてください。これに代えて

:MySQLの

SELECT @cv = `value` FROM `configs` WHERE `name` = 'cvDat'; 

はわからないが、これは、私はMS SQLで何をすべきかです:

SET @cv = (SELECT `value` FROM `configs` WHERE `name` = 'cvDat'); 

はこのようにそれを作ります。

+0

Opは問題がIFステートメントであると言います – Lizard

+0

MySQLは['SET'構文](http://dev.mysql.com/doc/refman/5.1/en/set-option.html)を完全にサポートしています選択が1行だけを返すので... – ircmaxell

0

フロー制御構造は、ストアドプロシージャまたは関数内でのみ使用できます。 proof link

+0

+1は-1を取り消すために提供されています(提供されている情報は回答のようです)... – ircmaxell

関連する問題