2013-08-28 5 views
0

Когда я называю процедуру, она возвращает ошибку:Сохраненная ошибка процедура, когда вызывается

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

Как это исправить, у меня есть ошибка в моем коде процедуры?

Вот моя хранимая процедура:

DELIMITER $$ 
DROP PROCEDURE IF EXISTS `gamedb`.`ALIAS#SEARCH`$$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `ALIAS#SEARCH`(
    in section_id varchar(255), 
    in category_id varchar(255), 
    in content_id varchar(255) 
) 

BEGIN 
declare q varchar(4000); 
set @q = 'SELECT * FROM tbl_alias WHERE ALIAS_ACTIVE_STATUS=1'; 

IF section_id IS NOT NULL THEN 
    set @q = concat(q,' AND ALIAS_SECTION_ID = ',section_id); 
END IF; 

IF category_id IS NOT NULL THEN 
    set @q = concat(q,' AND ALIAS_CATEGORY_ID = ',category_id); 
END IF; 

IF content_id IS NOT NULL THEN 
    set @q = concat(q,' AND ALIAS_CONTENT_ID = ',content_id); 
END IF; 

set @q= concat(q,' ORDER BY ALIAS_ID DESC'); 
prepare stmt from @q; 

EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END$$ 
DELIMITER ; 

ответ

0

Там несколько проблем

  1. Так как вы можете PREPARE только от переменного пользователя, вам не нужен локальный переменной q
  2. You» re missing @ для @q переменная при использовании CONCAT()

    set @q = concat(q,' AND ALIAS_SECTION_ID = ',section_id); 
           ^
    
  3. Поскольку ваши IN параметров определяются как VARCHAR лучше процитировать их значение при создании запроса

Это сказанное ваш SP может выглядеть следующим образом

DELIMITER $$ 
CREATE PROCEDURE `ALIAS#SEARCH`(
    in section_id varchar(255), 
    in category_id varchar(255), 
    in content_id varchar(255) 
) 

BEGIN 
    SET @q = 'SELECT * FROM tbl_alias WHERE ALIAS_ACTIVE_STATUS = 1'; 

    IF section_id IS NOT NULL THEN 
    SET @q = CONCAT(@q, ' AND ALIAS_SECTION_ID = ''', section_id, ''''); 
    END IF; 

    IF category_id IS NOT NULL THEN 
    SET @q = CONCAT(@q, ' AND ALIAS_CATEGORY_ID = ''', category_id, ''''); 
    END IF; 

    IF content_id IS NOT NULL THEN 
    SET @q = CONCAT(@q, ' AND ALIAS_CONTENT_ID = ''', content_id, ''''); 
    END IF; 

    SET @q = CONCAT(@q, ' ORDER BY ALIAS_ID DESC'); 

    PREPARE stmt FROM @q; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END$$ 
DELIMITER ; 
+0

@Hendra Помогло ли это? Вам нужна дополнительная помощь по вашему вопросу? – peterm

+0

Да, это работает. Спасибо за вашу помощь :) Это так полезно :) – Hendra

+0

@ Хендра Добро пожаловать. Пожалуйста, отметьте ответ, как принято. Вот [как это сделать] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – peterm

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