MySQL
имеет концепцию определяемые пользователем переменные .
Они являются свободно типизированными переменными, которые могут быть инициализированы где-то в сеансе и сохранять свое значениедо окончания сеанса.
К ним добавляется знак @
, например: @var
Вы можете инициализировать эту переменную с помощью оператора SET
или внутри запроса:
SET @var = 1
SELECT @var2 := 2
Когда вы разрабатываете хранимую процедуру в MySQL
, вы можете передать входные параметры и объявить локальные переменные:
DELIMITER //
CREATE PROCEDURE prc_test (var INT)
BEGIN
DECLARE var2 INT;
SET var2 = 1;
SELECT var2;
END;
//
DELIMITER ;
Эти переменные не содержат префиксов.
Разница между переменной процедуры и определяемой пользователем переменной сеанса заключается в том, что переменная процедуры повторно инициализируется до NULL
каждый раз, когда вызывается процедура, в то время как переменная сеанса не является:
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
Как видите, var2
(переменная процедуры) переинициализируется при каждом вызове процедуры, тогда как @var2
(переменная, относящаяся к сеансу) - нет.
(В добавленииКроме пользовательских переменных, MySQL также имеет некоторые предопределенные «системные переменные», которые могут быть «глобальными переменными», такими как @@global.port
или «переменными сеанса», такими как @@session.sql_mode
;эти «переменные сеанса» не связаны с пользовательскими переменными, специфичными для сеанса.)