如何在动态sql过程中设置值为输出参数?

时间:2014-04-03 07:10:54

标签: mysql dynamic-sql

我尝试使用以下代码。但它显示错误消息,如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

2 个答案:

答案 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设置为该用户变量。