Хранимые процедуры и функции

В SQL помимо обычных запросов существуют более мощные инструменты — хранимые процедуры и хранимые функции. Эти объекты позволяют создавать готовые блоки кода, которые можно многократно использовать 🔄.

Хранимые процедуры и функции — это заранее написанные и сохранённые в базе данных SQL-скрипты, которые можно вызывать по имени.

Представьте, что у вас есть сложный запрос для расчёта статистики продаж, который вы используете каждый день. Вместо того чтобы каждый раз переписывать его, можно создать процедуру или функцию и просто вызывать её!

Зачем они нужны?

Хранимые процедуры и функции решают несколько важных задач:

  • 🚀 Повторное использование кода — написали один раз, используете везде. Никаких копий одного и того же кода в разных местах.
  • ⚡ Производительность — код выполняется прямо на сервере базы данных, что часто быстрее обычных запросов.
  • 🔒 Безопасность — можно предоставить доступ к процедуре, не давая прямого доступа к таблицам.
  • 🛡️ Централизованная логика — вся бизнес-логика находится в одном месте, в базе данных.

Основные различия

Хотя процедуры и функции похожи, между ними есть важные различия:

ХарактеристикаХранимые процедурыХранимые функции
Возвращаемое значениеМожет не возвращать или возвращать несколько значенийВсегда возвращает одно значение
Использование в запросахВызывается отдельноМожно использовать в SELECT, WHERE и других частях запроса
Изменение данныхМожет изменять данные в таблицахПредназначены только для чтения данных
ВызовCALL procedure_name()SELECT function_name()
ХарактеристикаХранимые процедурыХранимые функции
Возвращаемое значениеНе могут возвращать значенияВсегда возвращает одно значение
Использование в запросахВызывается отдельноМожно использовать в SELECT, WHERE и других частях запроса
Изменение данныхМожет изменять данные в таблицахМожет изменять данные в таблицах
ВызовCALL procedure_name()SELECT function_name()

Когда использовать процедуры?

Хранимые процедуры лучше всего подходят когда нужно:

  • Выполнить последовательность операций (например, создать заказ, списать товар со склада, отправить уведомление)
  • Изменить данные в нескольких таблицах одновременно
  • Реализовать сложную бизнес-логику
  • Вернуть несколько результирующих наборов

Пример использования процедуры

Допустим, нам нужно создать процедуру для оформления заказа:

MySQL 8.1
-- Пример вызова процедуры (концептуальный)
CALL create_order(customer_id = 123, product_id = 456, quantity = 2);

Такая процедура может:

  1. Проверить наличие товара на складе
  2. Создать запись в таблице заказов
  3. Обновить остатки товара
  4. Добавить запись в историю операций

Когда использовать функции?

Хранимые функции идеальны когда нужно:

  • Выполнить вычисления и вернуть результат
  • Создать переиспользуемую формулу
  • Преобразовать данные определённым образом
  • Использовать результат в других SQL-запросах

Пример использования функции

Создадим функцию для расчёта скидки:

MySQL 8.1
-- Пример использования функции в запросе
SELECT
    product_name,
    price,
    calculate_discount(price, customer_type) AS discount_amount
FROM Products;

Такая функция принимает цену и тип клиента, а возвращает размер скидки, которую можно использовать в любых запросах.

Простое правило выбора

Если сомневаетесь, что выбрать, используйте это простое правило:

  • Нужно получить одно значение для использования в запросе? → Функция
  • Нужно выполнить набор действий или изменить данные? → Процедура

Закрепим знания

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

Экран слишком узкий

Для игры требуется минимальная ширина экрана 700px. Пожалуйста, увеличьте окно браузера или поверните устройство.

Что дальше?

Это была вводная статья, чтобы понять общую концепцию. В следующих материалах мы детально разберём как создавать и работать с хранимыми процедурами и функциями.