Хранимая процедура MySQL возвращает неправильное значение - PullRequest
0 голосов
/ 08 августа 2011

Когда я запрашиваю:

SELECT COUNT(*) FROM train WHERE agree<=0;

Возвращает 128.

Однако в моей хранимой процедуре:

DELIMITER $$
CREATE PROCEDURE sample(IN _cla VARCHAR(15))
BEGIN
    DECLARE _a INTEGER;
    SELECT COUNT(*) INTO _a FROM train WHERE _cla<=0;
    SELECT _a;
END

$$

ипосле

CALL sample('agree');

Возвращается 200. (Который, кстати, общее количество строк таблицы поезд)

Что я делаю не так?

РЕШЕНО!Новый код ниже:

DELIMITER \\

CREATE PROCEDURE sample (IN _car VARCHAR(15))
    BEGIN
        DECLARE _a INTEGER;
        SET @s = CONCAT('SELECT COUNT(*) FROM train WHERE ', _car, '<=0;');
        PREPARE stmt1 FROM @s;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
END\\

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Вы не можете делать то, что пытаетесь сделать:

_cla - это параметр varchar (50) , и вы не можете использовать его так, как если бы вы могли объединить этот параметр и сформировать оператор SQL.

Вы можете писать динамические операторы SQL только в том случае, если вы строите их конкатенирующими строками.

Пример:

DELIMITER \\

DROP PROCEDURE IF EXISTS `sp_test_dynamic_sql`\\
CREATE PROCEDURE `sp_test_dynamic_sql` (_min int, _max int)
BEGIN

SET @s = CONCAT('SELECT * FROM authors WHERE id BETWEEN ', _min, ' AND ', _max);

PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

END\\

DELIMITER ; 

Смотрите здесь

0 голосов
/ 08 августа 2011

Вы пытаетесь динамически изменить оператор SQL?

В этом случае вам нужно использовать PREPARE и EXECUTE.

...