Главная > MySQL > Хранимый код MySQL: переменные

Хранимый код MySQL: переменные

Хранимые процедуры в частях:
Часть 1. Переменные.
Часть 2. Prepared Statements.
Часть 3. Синтаксис хранимого кода
Часть 4. Функции и Процедуры
Часть 5. Триггеры

Для начала ознакомимся с переменными.

Переменные
Для конкретного процесса пользователь может определить локальные переменные, которые в MySQL обозначаются как @variablename. Имя локальной переменной может состоять из буквенно-цифровых символов установленного в данное время алфавита и символов ‘_’, ‘$’, и ‘.’. Тип кодировки по умолчанию – ISO-8859-1 Latin1, он может быть изменен указанием иного типа в аргументе параметра –default-character-set mysqld.
Все локальные переменные содержат значение NULL по умолчанию; в них могут храниться целые числа, вещественные числа или строковые величины. При запуске конкретного процесса все объявленные в нем локальные переменные автоматически активизируются.

Локальные переменные
Локальную переменную можно объявить, используя синтаксис команды SET:

SET @variable= { integer expression | real expression | string expression } [,@variable= ...]

Пример объявления переменной черех SET:

mysql: SET @myvar = "Hello, Aco!";
mysql: SELECT @myvar;
+----------------+
|     @myvar     |
+----------------+
| "Hello, Aco!"  |
+----------------+

Можно также определить значение переменной иным способом, без команды SET. Однако в этом случае в качестве оператора присвоения более предпочтительно использовать оператор ‘:=’, чем оператор ‘=’, так как последний зарезервирован для сравнения выражений, не связанных с установкой переменных:

mysql: SELECT @t1:=(@t2:=1)+@t3:=4, @t1, @t2, @t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

Введенные пользователем переменные могут применяться только в составе выражений и там, где выражения допустимы. Заметим, что в область их применения в данное время не включается контекст, в котором явно требуется число, например, условие LIMIT в команде SELECT или выражение IGNORE number LINES в команде LOAD DATA.

Примечание: в команде SELECT каждое выражение оценивается только при отправлении клиенту. Это означает, что в условиях HAVING, GROUP BY, or ORDER BY не следует ссылаться на выражение, содержащее переменные, которые введены в части SELECT этой команды. Например, следующая команда НЕ будет выполняться так, как ожидалось:

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;

Причина в том, что переменная @aa не будет содержать значения текущей строки, в то время как значение id в предыдущем выражении является строкой.

Области видимости
Здесь всё просто. Существуют два вида переменных: пользовательские переменные и переменные хранимого кода.
Пользовательские переменные создаются в момент присвоения им значения. Это значение хранится в переменной до завершения
соединения с сервером. Оно, разумеется, доступно и внутри хранимого кода:

mysql: SET @var=123;
Query OK, 0 rows affected (0.00 sec)

mysql: SELECT @var;
+------+
| @var |
+------+
| 123  |
+------+
1 row in set (0.00 sec)

Переменные хранимого кода же напротив – имеют ограниченную область видимости: в подпрограмме создавшей её. Они должны объявляться в хранимом коде и имеют совершенно определенный тип данных.

Время жизни
Переменные хранимого кода живут до завершении процедуры/функции/триггера в которых они объявлены. Пользовательские переменные умирают по завершению сессии.

Системные переменные
Начиная с MySQL 4.0.3 предоставляется доступ к большинству системных переменных и переменных, относящихся к соединению. Можно менять теперь большую часть переменных без необходимости останавливать сервер. Есть два типа системных переменных: специфичные для потока (или для соединения; мы их в дальнейшем называем потоковыми переменными для краткости), которые уникальны для данного соединения и глобальные перемененные, которые предназначаются для управления глобальными событиями. Глобальные переменные также используются для того, чтобы установить значения по умолчанию для соответствующих потоковых переменных для новых соединений.

Когда mysqld запускается, все глобальные переменные инициализируются из командной строки и файлов опций. Можно изменять значения с помощью SET GLOBAL. Когда новый поток создается, потоковые переменные инициализируются из глобальных и они не меняются даже если вы даете новую команду SET GLOBAL.
Для установки глобальной переменной: (Здесь используется sort_buffer_size в качестве примера)

SET GLOBAL sort_buffer_size=value;
SET @@global.sort_buffer_size=value;

Чтобы установить значение для потоковой переменной, используется такой синтаксис:

SET SESSION sort_buffer_size=value;
SET @@session.sort_buffer_size=value;
SET sort_buffer_size=value;

Если не указан режим, то тогда подразумевается SESSION.

LOCAL – синоним для SESSION.

Для получения значения глобальной переменной используется одна из этих команд:

SELECT @@global.sort_buffer_size;
SHOW GLOBAL VARIABLES like ‘sort_buffer_size’;

Для получения значения потоковой переменной:

SELECT @@session.sort_buffer_size;
SHOW SESSION VARIABLES like ‘sort_buffer_size’;

Ссылки
http://dev.mysql.com/doc/refman/5.0/en/set-option.html
http://dev.mysql.com/doc/refman/5.0/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.0/en/server-session-variables.html
http://www.phpclub.ru/mysql/doc/system-variables.html

Categories: MySQL Tags:
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.