存储过程中的“@”符号?

时间:2013-03-10 14:51:41

标签: mysql database stored-procedures

我尝试在网上找到答案,但找不到任何明确的解释:

存储过程中的@是否具有某种特殊用途/特别表示某些内容?我们在使用它时有点困惑,因为示例似乎因其使用情况而异。

例如,在以下示例中使用了@:

DELIMITER $

DROP PROCEDURE IF EXISTS emp_count_2;

CREATE PROCEDURE emp_count_2(OUT param1 INT)
BEGIN
 SELECT COUNT(*) INTO param1 FROM Employee;
END
$
DELIMITER ;


/* To invoke this procedure use the mysql command statement
   CALL emp_count_2(@empCount);
   SELECT @empCount; 
*/

再一次,这个例子中的@是否有某种特殊用途,或者我们可以删除@并只使用普通变量名吗?

**编辑:我正在使用MySql

1 个答案:

答案 0 :(得分:6)

MySQL中的@variable语法表示用户定义的会话变量。您可以在存储过程外部设置这些用户变量,但也可以在存储过程中设置它们,结果是变量在过程调用返回后保留该值。

因此,在您的示例中,以下内容也会执行相同的操作:

CREATE PROCEDURE emp_count_2()
BEGIN
 SELECT COUNT(*) INTO @empCount FROM Employee;
END

CALL emp_count_2(); /* sets @empCount as a side-effect */
SELECT @empCount;

多个会话可以同时以这种方式设置用户变量,因为用户变量的范围限定为单个会话,并发会话可能具有相同名称但具有不同值的变量。

没有@前缀的变量语法用于过程本地的变量,过程参数,或过程体内用DECLARE声明的局部变量。

如果要多次调用过程并将结果存储在单独的用户变量中,那么将此用法作为参数传递用户变量并将其分配到过程体中是很有用的。否则,对该过程的每次调用都将覆盖当前会话的@empCount用户变量中的先前值。