Проблема в том, что конструкция потока управления IF
работает только в хранимых процедурах (точно так же, как все другие конструкции управления потоком 1003 * ... Поэтому вам нужно определить процедуру, чтобы делать то, что вы 'Вы спрашиваете ...
Итак, вот как определить пример процедуры для выполнения того, что вы хотите:
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();
См. документы для получения дополнительной информации.
Вы даже можете сделать так, чтобы параметры принимались, поэтому вам не нужно жестко кодировать все. Но я не уверенкак вы это сделаете, основываясь на том, что вы предоставили (я не уверен, что именно вы пытаетесь выполнить) ...
Если вы хотите, чтобы это было сделано, в качестве параметра используется оператор SQL (используя Подготовленные заявления ):
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
для удобства чтения,не потому что они нужны) ...