Переменные в 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; просмотров: 5172;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.009 сек.