2012-12-27 103 views
0

当我没有用了变量,存储过程工作正常,但是当我执行与out变量的存储过程,这个错误显示出来:MySQL存储过程的动态选择与出可变

MySQL表示:#1327 - 未声明的变量:sp_result

代码:

CREATE DEFINER=`root`@`localhost` PROCEDURE `test3`(OUT `sp_result` INT(11), IN `sp_where_param` VARCHAR(100), IN `sp_where_value` VARCHAR(100), IN `sp_table_name` VARCHAR(100)) 
NO SQL 
BEGIN 
DECLARE tbl_id VARCHAR(100); 

SET tbl_id = CONCAT(sp_table_name,'_id'); 

SET @temp1=CONCAT('SELECT count(',tbl_id,') INTO sp_result FROM ',sp_table_name,' WHERE ',sp_where_param,' = \'',sp_where_value,'\''); 
PREPARE stmt1 FROM @temp1; 
EXECUTE stmt1; 

END 

也许不出来变量也不起作用:(

回答

1

尝试使用用户变量 -

CREATE DEFINER = 'root'@'localhost' 
PROCEDURE test3 (OUT `sp_result` int(11), IN `sp_where_param` varchar(100), IN `sp_where_value` varchar(100), IN `sp_table_name` varchar(100)) 
NO SQL 
BEGIN 
    DECLARE tbl_id varchar(100); 

    SET tbl_id = CONCAT(sp_table_name, '_id'); 

    SET @temp1 = CONCAT('SELECT COUNT(', tbl_id, ') INTO @sp_result FROM ', sp_table_name, ' WHERE ', sp_where_param, ' = \'', sp_where_value, '\''); 

    PREPARE stmt1 FROM @temp1; 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 

    set sp_result = @sp_result; 

END 

...并添加DEALLOCATE PREPARE语句。

+0

你是对的:)。你可以告诉我什么是用户变量?当我们使用@时有什么不同? – navid

+1

有:用户变量 - 可以在会话中访问,声明的变量 - 用DECLARE命令声明并可在BEGIN ... END子句中访问,以及'procedure/function parameters' - 可以使用仅在程序/功能中。看来参数不能用于预先准备好的语句中;所以,我建议用户变量。 – Devart

+0

非常感谢:) – navid

0

应该是─

SET tbl_id = CONCAT(sp_table_name,'_id'); 
SET @temp1=CONCAT('SELECT count(',tbl_id,') INTO 

这样

SET @tbl_id:= CONCAT(sp_table_name,'_id'); 
SET @temp1:=CONCAT('SELECT count(',tbl_id,') INTO 
+0

我编辑我的问题,请再次检查 – navid

+0

我尽你所说,但仍然不工作。错误:'MySQL说:#1327 - 未声明的变量:sp_result' – navid