Используя select в локальную переменную и подготовленный оператор в MySQL - PullRequest
2 голосов
/ 27 октября 2011

Каждый раз при вызове этой хранимой процедуры я получаю эту ошибку:

#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 `singledb`.`TOUR_TRANSFER`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `TOUR_TRANSFER`()
BEGIN

BEGIN -- for rubric table
            DECLARE tblRubric_rubric_id INT;
            SET @qry = concat('SELECT count(*) into ',tblRubric_rubric_id,' FROM zerodb2.tour_template');
            PREPARE statement FROM @qry;
            EXECUTE statement;

            SELECT tblRubric_rubric_id;
END;
END$$

DELIMITER ;

Ответы [ 2 ]

11 голосов
/ 28 октября 2011

С http://bugs.mysql.com/bug.php?id=15263:

"Маркеры параметров можно использовать только там, где должны отображаться значения данных, но не для ключевых слов, идентификаторов и т. Д."

Итак, мы не можем сделать:

ПОДГОТОВИТЬ stmt ОТ ВЫБРАТЬ id В?ОТ t1 ';

Мы не можем использовать?вместо идентификатора (имя переменной).

И когда вы используете имя параметра:

ПОДГОТОВИТЬ stmt FROM 'SELECT id INTO rid FROM t1';

в подготовленной строкетогда сервер просто не знает, на что ссылается этот избавитель в заявлении, которое вы пытаетесь подготовить.Вы можете попытаться подготовить его вне SP с тем же результатом:

mysql> prepare stmt из 'select id to p from t1';ОШИБКА 1327 (42000): необъявленная переменная: p

Итак, я только что использовал переменную пользователя, см. Ниже:

DROP PROCEDURE IF EXISTS `singledb`.`TOUR_TRANSFER`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `TOUR_TRANSFER`()
BEGIN
BEGIN -- for rubric table
            -- DECLARE @tblRubric_rubric_id INT;

            SET @tblRubric_rubric_id := 0;
            SET @qry = 'SELECT count(*) into @tblRubric_rubric_id FROM zerodb2.tour_template';
            PREPARE statement FROM @qry;
            EXECUTE statement;
END;
END$$
0 голосов
/ 27 октября 2011

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

DELIMITER $$

DROP PROCEDURE IF EXISTS TOUR_TRANSFER;
CREATE PROCEDURE TOUR_TRANSFER()


BEGIN # for rubric table
DECLARE tblRubric_rubric_id INT;

SET @qry := CONCAT('SELECT count(*) FROM zerodb2.tour_template');
PREPARE statement FROM @qry;
EXECUTE statement;

#SELECT tblRubric_rubric_id; # i don't think this will work

END$$

DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...