2013-03-10 136 views
1

我试着找到这个在线答案,但找不到任何明确的解释:存储过程中的“@”符号?

存储过程中的@是否提供某种特殊用途/特别表示某种东西?我们在使用它的时候有点困惑,因为它们的用法似乎有所不同。

例如在下面的例子中@用于:

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

+0

访问reff:[**在MySQL **中的会话变量](http://stackoverflow.com/questions/1009954/mysql-variable-vs-variable-whats-the-difference)。 – 2013-03-10 14:52:49

+0

你使用了哪个数据库? – Oded 2013-03-10 14:53:00

+0

@GrijeshChauhan是@仅用于访问存储过程之外的var值吗?因为我们没有在存储过程中使用@所以是@只是sql脚本语法的一部分? – rrazd 2013-03-10 14:55:57

回答

4

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

所以,在你的榜样,下面也会做同样的事情:

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

+0

你的回答非常好] – 2013-03-10 16:14:17