1

I have noticed in mysql that why preparing a dynamic query it requires what I think is a global variable. Is there a way to limit the scope of the variable to only betwenn the begin and end statements? Below is my test script when returns a value of 10 for the limitCnt variable.

delimiter //
drop procedure if exists testProc//
create procedure testProc ()
begin
--  DECLARE limitCnt INT default 10;
  SET @limitCnt = 10;

  PREPARE stmt FROM 'SELECT * FROM `participants` LIMIT ?';
  EXECUTE stmt USING @limitCnt; -- the using part of the execute does not like the local variable

  DEALLOCATE PREPARE stmt;
end//
call testProc()//
select @limitCnt//

drop procedure testProc//
delimiter ;
4

3 回答 3

1

如果你想使用局部变量,那么它们必须在begin...end块内限定范围,但是如果你在一些和块内begin嵌套了和块,那么在“所谓的”父级和块中声明的变量可以从“所谓的”子级访问,并且块。请通读http://dev.mysql.com/doc/refman/5.0/en/local-variable-scope.htmlendbeginendbeginendbeginend

您在代码中所做的是设置一个名为的会话变量,该变量limitCnt可在您的过程中的任何位置访问和使用,因此您在执行时会得到10结果select @limitCnt

declare var_name var_type要在块中使用局部变量begin...end

希望这能回答你的问题。

于 2013-07-03T01:06:25.380 回答
0

根据MySQL 5.0 Documentation,您不能在EXECUTE ... USING语句中使用局部变量。有关如何使用该语句,请参阅以下文档的摘录:

EXECUTE stmt_name
[USING @var_name [, @var_name] ...]

您必须使用 @ 前缀。

于 2013-07-03T01:23:23.400 回答
0

没有其他办法了。这是 MySql 设计的。

本地/存储过程/存储函数级变量

  1. 不能用于PREPARE
  2. 不能在您准备好的陈述中提及
  3. 不能用于将参数值传递给EXECUTEwithUSING

PREPARE 语法
... 语句名称不区分大小写。preparable_stmt 是字符串文字或包含 SQL 语句文本的用户变量。...

...在存储程序上下文中准备的语句不能引用存储过程或函数参数或局部变量,因为它们在程序结束时超出范围并且如果稍后在程序之外执行该语句将不可用。...

EXECUTE 语法
... 参数值只能由用户变量提供,并且 USING 子句必须命名与语句中参数标记的数量一样多的变量。...

用户变量具有会话范围。

现在,为了解决您的问题,请始终在使用用户定义的变量之前显式设置一个值。就像您为@limitCnt.

SET @limitCnt = 10;

NULL您也可以在存储过程/存储函数/脚本的末尾为此类变量设置一个值。

SET @limitCnt = NULL;

这是SQLFiddle演示

于 2013-07-03T01:23:33.687 回答