MySQL IF Statement - скрипт с ошибкой - PullRequest
3 голосов
/ 18 ноября 2010

Я создаю скрипт обновления MySQL, который позволит мне объединить все мои изменения sql с несколькими базами данных, используя временную метку, чтобы определить, какие изменения уже были обновлены.

Я установил @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 

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2010

Проблема в том, что конструкция потока управления 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 для удобства чтения,не потому что они нужны) ...

0 голосов
/ 18 ноября 2010

Вы можете использовать конструкции управления потоком только внутри хранимых процедур или функций. ссылка для подтверждения

0 голосов
/ 18 ноября 2010

Просто попробуйте.

Вместо этого:

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

Сделайте так:

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

Не уверен для MySql, но эточто я делаю в MS SQL.

...