3

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

存储过程中的 @ 是否有某种特殊用途/特别表示某些东西?我对我们何时使用它感到有些困惑,因为示例似乎在其用法上有所不同。

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

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

4

1 回答 1

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 用户变量中的先前值。

于 2013-03-10T15:19:28.013 回答