MySQL存储过程返回不正确的值

时间:2011-08-08 17:33:48

标签: mysql procedure

当我查询时:

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 个答案:

答案 0 :(得分:1)

你无法做你想做的事情:

_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 ; 

See here

答案 1 :(得分:0)

您是否尝试动态更改SQL语句?

在这种情况下,您必须使用PREPARE和EXECUTE。