MySQL ma koncepcję zmiennych zdefiniowanych przez użytkownika .
Są to zmienne o luźnym typie, które mogą być inicjowane gdzieś w sesji i zachowują swoją wartość aż do zakończenia sesji.
Są poprzedzone @
znak, na przykład:@var
Możesz zainicjować tę zmienną za pomocą SET
oświadczenie lub wewnątrz zapytania:
SET @var = 1
SELECT @var2 := 2
Kiedy tworzysz procedurę składowaną w MySQL, możesz przekazać parametry wejściowe i zadeklarować zmienne lokalne:
DELIMITER //
CREATE PROCEDURE prc_test (var INT)
BEGIN
DECLARE var2 INT;
SET var2 = 1;
SELECT var2;
END;
//
DELIMITER ;
Te zmienne nie są poprzedzone żadnymi przedrostkami.
Różnica między zmienną procedury a zmienną zdefiniowaną przez użytkownika specyficzną dla sesji polega na tym, że zmienna procedury jest ponownie inicjowana do NULL
za każdym razem, gdy wywoływana jest procedura, podczas gdy zmienna specyficzna dla sesji nie jest:
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
Jak widać, var2
(zmienna procedury) jest ponownie inicjowana przy każdym wywołaniu procedury, podczas gdy @var2
(zmienna specyficzna dla sesji) nie jest.
(Oprócz zmiennych zdefiniowanych przez użytkownika MySQL również ma pewne predefiniowane „zmienne systemowe”, które mogą być „zmiennymi globalnymi”, takimi jak @@global.port
lub „zmienne sesji”, takie jak @@session.sql_mode
; te „zmienne sesji” nie są powiązane ze zmiennymi zdefiniowanymi przez użytkownika specyficznymi dla sesji).