Параметры хранимых процедур онлайн урок.


Процедуры могут зависеть от параметров. Параметры могут быть трех видов - IN, OUT, INOUT.

  • IN - эти параметры аналогичны параметрам в PHP. В теле процедуры создается локальная копия параметра и ее изменения не влияют на внешнее значения параметра. Этот тип является типом по умолчанию.

  • OUT - эти параметры аналогичны параметрам, переданным по ссылке в PHP. Процедура изменяет значения этих параметров.

  • INOUT - это комбинированный тип IN, OUT


Для определения параметра необходимо указать его тип, название и тип данных.

Рассмотрим примеры. Создадим процедуру поиска студента по имени, используя параметр IN

DELIMITER $$
CREATE PROCEDURE searchByName(IN s_name VARCHAR(255))
BEGIN
SELECT * FROM student WHERE name = s_name;
END $$

DELIMITER ;
CALL searchByName('Andy');

+----+------+------+-----------+----------+
| id | name | age | phone | group_id |
+----+------+------+-----------+----------+
| 4 | Andy | 20 | 244-34-12 | 3 |
| 6 | Andy | 24 | 323-43-98 | 1 |
+----+------+------+-----------+----------+
2 rows in set (0.01 sec)

При каждом вызове этой процедуры, мы получаем поиск по переданному параметру. Создадим теперь процедуру с OUT параметром.

DELIMITER $$
CREATE PROCEDURE getMaxAgeByName(OUT max_age INT, IN s_name VARCHAR(255))
BEGIN
SELECT MAX(age) INTO max_age
FROM student
WHERE name = s_name;
END $$

DELIMITER ;
CALL getMaxAgeByName(@m, 'Andy');

SELECT @m AS max_age;
+---------+
| max_age |
+---------+
| 27 |
+---------+
1 row in set (0.00 sec)

Первое, что необходимо отметить - это оператор INTO в запросе SELECT. Этот оператор позволяет записать результат в параметр, указанный после INTO. Второе, это вызов процедуры. OUT параметр записан в виде @m, что означает, что он сохранит свое значение, которое получит в теле процедуры. В конце мы исполняем запрос SELECT где используем этот параметр.

Напишем теперь простую процедуру для INOUT параметра.

DELIMITER $$
CREATE PROCEDURE increase(INOUT a INT)
BEGIN
SET a = a + 1;
END $$

DELIMITER ;

SET @x = 25;

CALL increase(@x);
CALL increase(@x);

SELECT @x AS x;

+------+
| x |
+------+
| 27 |
+------+
1 row in set (0.00 sec)