MySQL: variável versus variável. Qual é a diferença?

Em outra pergunta eu postei alguém me disse que há uma diferença entre:

@variable 

e:

 variable 

no MySQL. Ele também mencionou como o MSSQL tem escopo de lote e o MySQL tem escopo de session. Alguém pode elaborar isso para mim?

MySQL possui o conceito de variables ​​definidas pelo usuário .

Eles são variables ​​que podem ser inicializadas em algum lugar em uma session e mantêm seu valor até que a session termine.

Eles são prefixados com um sinal @ , como este: @var

Você pode inicializar esta variável com uma instrução SET ou dentro de uma consulta:

 SET @var = 1 SELECT @var2 := 2 

Quando você desenvolve um procedimento armazenado no MySQL , você pode passar os parâmetros de input e declarar as variables ​​locais:

 DELIMITER // CREATE PROCEDURE prc_test (var INT) BEGIN DECLARE var2 INT; SET var2 = 1; SELECT var2; END; // DELIMITER ; 

Essas variables ​​não são prefixadas com nenhum prefixo.

A diferença entre uma variável de procedimento e uma variável definida pelo usuário específica da session é que a variável de procedimento é reinicializada para NULL toda vez que o procedimento é chamado, enquanto a variável específica da session não é:

 CREATE PROCEDURE prc_test () BEGIN DECLARE var2 INT DEFAULT 1; SET var2 = var2 + 1; SET @var2 = @var2 + 1; SELECT var2, @var2; END; SET @var2 = 1; CALL prc_test(); var2 @var2 --- --- 2 2 CALL prc_test(); var2 @var2 --- --- 2 3 CALL prc_test(); var2 @var2 --- --- 2 4 

Como você pode ver, var2 (variável de procedimento) é reinicializado toda vez que o procedimento é chamado, enquanto @var2 (variável específica da session) não é.

(Além das variables ​​definidas pelo usuário, o MySQL também possui algumas “variables ​​de sistema” predefinidas, que podem ser “variables ​​globais” como @@global.port ou “variables ​​de session” como @@session.sql_mode ; essas “variables ​​de session “não estão relacionados a variables ​​definidas pelo usuário específicas da session.)

No MySQL, @variable indica uma variável definida pelo usuário . Você pode definir o seu próprio.

 SET @a = 'test'; SELECT @a; 

Fora dos programas armazenados, uma variable , sem @ , é uma variável do sistema , que você não pode definir sozinho.

O escopo dessa variável é a session inteira. Isso significa que enquanto sua conexão com o database existe, a variável ainda pode ser usada.

Isso está em contraste com o MSSQL, em que a variável estará disponível apenas no lote atual de consultas (procedimento armazenado, script ou outro). Não estará disponível em um lote diferente na mesma session.

O MSSQL requer que as variables ​​dentro dos procedimentos sejam DECLARADAS e as pessoas usem a syntax @Variable (DECLARE @TEXT VARCHAR (25) = ‘text’). Além disso, o MS permite declarar dentro de qualquer bloco no procedimento, ao contrário do mySQL, que exige todos os DECLAREs no topo.

Embora seja bom na linha de comando, sinto que usar o “set = @variable” nos stored procedures no mySQL é arriscado. Não há escopo e variables ​​ao longo dos limites do escopo. Isso é semelhante a variables ​​em JavaScript sendo declaradas sem o prefixo “var”, que são, então, o namespace global e criam colisões e substituições inesperadas.

Eu estou esperando que o pessoal bom no mySQL permita DECLARE @Variable em vários níveis de bloco dentro de um procedimento armazenado. Observe o @ (no sinal). O prefixo @ sign ajuda a separar os nomes das variables ​​dos nomes das colunas das tabelas – pois elas são geralmente as mesmas. É claro que sempre é possível adicionar um prefixo “v” ou “l_”, mas o sinal @ é uma maneira prática e sucinta de fazer com que o nome da variável corresponda à coluna da qual você pode extrair os dados sem obtê-lo.

O MySQL é novo em stored procedures e eles fizeram um bom trabalho em sua primeira versão. Será um prazer ver onde eles tomam forma aqui e assistir os aspectos do lado do servidor da linguagem amadurecerem.

Em princípio, eu uso UserDefinedVariables (prefixado com @) em Stored Procedures. Isso facilita a vida, especialmente quando eu preciso dessas variables ​​em dois ou mais stored procedures. Apenas quando eu preciso de uma variável apenas dentro de um procedimento armazenado, que eu uso uma variável do sistema (sem prepended @).

@ Xybo: Eu não entendo porque usar @variables em StoredProcedures deve ser arriscado. Poderia, por favor, explicar “escopo” e “limites” um pouco mais fácil (para mim como um newbe)?