我尝试使用以下代码。但它显示错误消息,如undeclared variable :nt
。
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_ntime`(in tb varchar(50),in d int, out nt varchar(50))
BEGIN
SET @statment = concat('Select ntime into nt from ',tb);
SET @date = CONCAT(' WHERE date = "', d, '"');
SET @statmen = CONCAT(@statment, @date);
PREPARE stmt FROM @statment;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
答案 0 :(得分:1)
在单引号nt
中使用时,不会将其视为变量,而是文字
使用局部变量将值设置为并在执行后将其分配给out参数。
示例:
DELIMITER //
CREATE DEFINER=`root`@`localhost`
PROCEDURE `get_ntime`( in tb varchar(50), in d int, out nt varchar(50) )
BEGIN
SET @staetment = concat( 'Select ntime into @nTime from ', tb );
-- SET @date = CONCAT( ' WHERE date = "', d, '"' );
SET @date = CONCAT( ' WHERE date = ?' );
SET @statement = CONCAT( @statement, @date );
SET @dt := d;
PREPARE stmt FROM @statement;
-- EXECUTE stmt;
EXECUTE stmt using @dt;
DEALLOCATE PREPARE stmt;
SET nt := @nTime;
END;
//
DELIMITER ;
答案 1 :(得分:0)
预备语句具有会话范围,mysql不知道您只想在存储过程中使用预准备语句。你立即解除声明,但它并不总是那样。
这就是为什么mysql不允许在预准备语句中使用范围较小的任何东西 - 就像in和out参数一样,它们具有存储过程的范围。
作为mysql prepare statement manual中提到的解决方法,您可以在预准备语句中使用用户变量,然后将您的paremeter设置为该用户变量。