【问题标题】:"@" symbol in stored procedure?存储过程中的“@”符号?
【发布时间】:2013-03-10 14:51:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 访问参考:session variables in MySQL.
  • 你用的是什么数据库?
  • @GrijeshChauhan 是 @ 仅用于访问存储过程之外的 var 值吗?因为我们不在存储过程中使用@...所以@只是sql脚本语法的一部分??
  • @rrazd 好的,如果没有存储变量 like here used?

标签: mysql database stored-procedures


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多