Переменные в MYSQL.
Существует два вида переменных: глобальные и локальные. Глобальные переменные действуют везде, локальные только в пределах процедуры. Глобальные переменные создаются в момент присвоения им значения. Это значение хранится в переменной до завершения соединения с сервером. Разумеется, они доступны внутри хранимых процедур. Символ @ ставится перед глобальной переменной при объявлении.
SET @Var = 123;
SELECT @Var;
Локальные переменные объявляются внутри хранимой процедуры, видны только там, создаются в момент вызова процедуры и уничтожаются в момент завершения работы процедуры. При объявлении не надо указывать символ @, но надо декларировать такие переменные:
CREATE PROCTDURE PROC()
BEGIN
DECLARE Pvar INT;
SET Pvar = 2;
SELECT Pvar
END;
Если попытаться получить значение этой переменной вне процедуры, получим ошибку:
SELECT Pvar;
ERROR 1054 (42S22): Unknown column 'pvar' in 'field list'
Процедура может включать не только запросы, а также и др команды, обычные команды языка программирования (управляющие конструкции, циклы и т.п.)
Внутри процедуры можно создать локальную переменную:
CREATE PROCEDURE SP_simple()
BEGIN
DECLARE name VARCHAR(5);
DECLARE newname VARCHAR(5)= ‘BOB‘;
SET @x =1;
END;
Таким образом, внутри самой процедуры локальную переменную необходимо сначала объявить DECLARE name VARCHAR(5); А потом установить ей значение с помощью
SET name = ‘BOB‘;
Пример объявления переменных:
delimiter |
CREATE PROCEDURE var_proc (IN paramstr VARCHAR(20))
BEGIN
DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;
INSERT INTO table1 VALUES(a);
SET str ='I am a string';
SELECT CONCAT(str,paramstr), today FROM table2 WHERE b >=5;
END;
|
delimiter ;
Структуры и управления потоками в хранимых процедурах.
MySQL поддерживает конструкции IF, CASE, ITERATE, LEAVE LOOP, WHILE и REPEAT для управления потоками в пределах хранимой процедуры. Мы рассмотрим, как использовать IF, CASE и WHILE, так как они наиболее часто используются.
Конструкция IF
С помощью конструкции IF, мы можем выполнять задачи, содержащие условия:
delimiter |
CREATE PROCEDURE `proc_IF` (IN param1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = param1 + 1;
IF variable1 = 0 THEN
SELECT variable1;
END IF;
IF param1 = 0 THEN
SELECT 'Parameter value = 0';
ELSE
SELECT 'Parameter value <> 0';
END IF;
END;
|
delimiter ;
Конструкция case, с ней мы знакомы в выражении SELECT, но она допустима и в хранимых процедурах:
DELIMITER // | |||||||||||||||||
CREATE PROCEDURE `proc_CASE` (IN param1 INT) | |||||||||||||||||
BEGIN | |||||||||||||||||
DECLARE variable1 INT; | |||||||||||||||||
SET variable1 = param1 + 1; | |||||||||||||||||
CASE | |||||||||||||||||
WHEN variable1 = 0 THEN | |||||||||||||||||
INSERT INTO table1 VALUES (param1); | |||||||||||||||||
WHEN variable1 = 1 THEN | |||||||||||||||||
INSERT INTO table1 VALUES (variable1); | |||||||||||||||||
ELSE | |||||||||||||||||
INSERT INTO table1 VALUES (99); | |||||||||||||||||
END CASE; | |||||||||||||||||
END // | |||||||||||||||||
Конструкция WHILE
Технически, существует три вида циклов: цикл WHILE, цикл LOOP и цикл REPEAT. Вот пример цикла:
DELIMITER // | |||||||||||||
CREATE PROCEDURE `proc_WHILE` (IN param1 INT) | |||||||||||||
BEGIN | |||||||||||||
DECLARE variable1, variable2 INT; | |||||||||||||
SET variable1 = 0; | |||||||||||||
WHILE variable1 < param1 DO | |||||||||||||
INSERT INTO table1 VALUES (param1); | |||||||||||||
SELECT COUNT(*) INTO variable2 FROM table1; | |||||||||||||
SET variable1 = variable1 + 1; | |||||||||||||
END WHILE; | |||||||||||||
END // | |||||||||||||
LEAVE –прервать цикл
ITERATE – Продолжить следующую итерацию
Хранимые функции – идея та же самая, логика на стороне сервера. Хранимая функция возвращает какое-то одно значение.
CREATE FUNCTION ИмяПроцедуры RETURNS ТипДанных
BEGIN
Запросы на языке SQL
END;
Функции можно использовать в SQL-операторах. Именно для этого они и используются.
Пример. Пусть дано отношение R1(room, lesson_date). Требуется вывести на экран всю эту таблицу отстортировав ее по полю room. Предположим в поле room хранятся следующие значения: БК-1 БК-2 БК-3 БК-4 БК-11 БК-22 БК-3
Выполним простой запрос
SELECT room, lesson_date
FROM R1
ORDER BY room;
В результате мы получим:
Здесь удобно использовать функцию:
DELIMITER |
CREATE FUNCTION sp_room_number(room VARCHAR(5)) RETURNS INT
BEGIN
RETURN SUBSTR(room,4)*1; //аналог функции ПРАВ
END;
DELIMITER ;
Теперь используем эту функцию:
SELECT room, lesson_date
FROM R1
ORDER BY sp_room_number (room);
Дата добавления: 2017-08-01; просмотров: 5277;