2013-11-26 4 views
0

Для жизни меня, я не могу понять, почему я получаю эту ошибку:.MySQL хранимых процедуры 1064 Ошибка

[Err] 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 'NULL' at line 1

Я звоню простую хранимую процедуру с некоторыми переменными, переданными в чем вы не видите здесь настройки разделителя на //, но это тоже сделано.

Спасибо большое!

SET @dest_database     = 'my_db'; 
SET @table_category_management_pages = 'category_management_pages'; 


CREATE PROCEDURE category_management_pages(
    IN in_name varchar(255), 
    IN in_display varchar(255), 
    IN in_notes varchar(255), 
    IN in_order INT, 
    IN in_title varchar(255), 
    IN in_access_name varchar(255) 
) 
    BEGIN 
    IF NOT EXISTS(
     SELECT * FROM information_schema.COLUMNS 
     WHERE 
     TABLE_SCHEMA = @dest_database AND 
     TABLE_NAME = @table_category_management_pages AND 
     COLUMN_NAME = 'key_hash' 
    ) THEN 
     # Add UNIQUE index on key_hash 
     SET @myPrep = CONCAT('ALTER TABLE `', @dest_database, '`.`', @table_category_management_pages, '` ADD COLUMN `key_hash` varchar(255) NULL, ADD UNIQUE INDEX (`key_hash`);'); 
     prepare stmt from @myPrep; 
     execute stmt; 
    END IF; 

    # Update key_hash to latest hash 
    SET @myPrep = CONCAT('UPDATE `', @dest_database, '`.`', @table_category_management_pages, '` 
     SET `key_hash` = md5(`name`)'); 
    prepare stmt from @myPrep; 
    execute stmt; 

END// 
+0

Вы заявляли ** @ myPrep ** где-то перед его использованием? –

+0

Я не думаю, что это необходимо. У меня есть другая процедура, которая отлично работает с тем же синтаксисом в этом отношении. –

+0

, если используется локальная переменная, она должна быть объявлена ​​перед использованием. Если используется глобальная переменная, объявление не требуется, поскольку оно уже было объявлено ранее системой. Также проверьте установку mysql. Новые версии в предыдущих версиях ужесточили некоторые правила. –

ответ

0

Я отвечаю на свой вопрос, потому что я узнал, почему подготовленный оператор не работает, и это что-то действительно просто немой, но может повлиять на других людей в будущем. В нашей компании у нас есть привычка выстраивать все равные знаки при объявлении переменных (см. Правки выше). Ну, похоже, что MySQL не любит пробелы таким образом, поэтому глобальные переменные не были правильно переданы в подготовленном операторе. Изменив заявление на это:

/* Globals */ 
SET @dest_database = 'my_db'; 
SET @table_category_management_pages = 'category_management_pages'; 

... отработан прекрасный. Идите фигуру. Оба предложения в комментариях были хорошими, но в конце концов это было что-то из-за пробелов. Очень расстраивает, но я надеюсь, что это поможет кому-то в будущем.

+0

Кажется, что должно быть что-то другое, кроме как только пробелов; У MySQL нет проблем с отмеченными равными знаками, и вы можете подтвердить это, установив переменные, а затем «SELECT @dest_database, @table_category_management_pages;», чтобы подтвердить, что назначение выполнено ... но сообщение об ошибке указывает что что-то было null, поскольку concat() возвращает null, если любой аргумент равен null, а 'PREPARE STMT FROM @ foo' вернет эту точную ошибку, если @foo имеет значение null. Я предполагаю, что вы знаете, что они не являются фактически «глобальными» переменными, они являются определяемыми пользователем переменными с областью сеанса. –

Смежные вопросы