当我查询时:
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\\
答案 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 ;
答案 1 :(得分:0)
您是否尝试动态更改SQL语句?
在这种情况下,您必须使用PREPARE和EXECUTE。