📌Кратко
Хранимые процедуры предназначены для выполнения действий, а пользовательские функции - для вычислений и возврата значений.
✔️Хранимые процедуры
Это набор инструкций, которые выполняют любые операции с данными, сложную логику или задачи на стороне сервера БД
🟡компилируются один раз и хранятся на сервере
🟡могут содержать циклы, условные операторы
🟡как в обычном коде в языках программирования, можно реализовать логику работы с данными
🟡могут принимать параметры и возвращать результаты, но могут и не возвращать
Как используются?
🔘выполнение сложных операций (сортировка, фильтрация и агрегация), сложной бизнес-логики
🔘могут включать несколько операций, которые выполняются как одна транзакция
🔘последовательное выполнение нескольких SQL-команд
🔘регулярно выполняющихся операций, требующих быстрого повторного исполнения
🔘обеспечивают защиту, выполняясь на стороне сервера БД, а также контролируют доступ и выполнение операций. С помощью процедур можно реализовать логику доступа, проверки прав и аутентификации пользователей
Примеры
⏩процедура принимает ID сотрудника в качестве входного параметра и возвращает его имя из таблицы Employees
⏩процедура принимает данные о новом заказе (например, клиент, товары, количество) и добавляет соответствующую запись в базу данных.
⏩входной параметр -- ID заказа, процедура извлекает информацию о товарах в заказе и вычисляет стоимость всех товаров.
〰️ Минусы
💩 когда сложны, тяжело поддерживаемы, возникают проблемы с рефакторингом
💩могут создавать зависимость от конкретной СУБД — затрудняет масштабирование
💩хранение бизнес-логики в PLSQL ведет к созданию монолита. Его дальнейшее разбиение затрудняется
💩 отладка не всегда удобна, логирование и обработка ошибок выполняется вручную
✅ Пользовательские функции
Это фрагменты кода, предназначенные для выполнения конкретных операций или вычислений над данными
🔵принимают входные параметры, выполняют определенные вычисления и всегда возвращают результат
🔵не предназначены для изменения данных или выполнения транзакций
Как используются?
🔘 для сложных логических или арифметических операций
🔘возвращаемые значения используются в др. запросах / выражениях
🔘для использования операторах SQL (SELECT, WHERE и тд) для вычисления значений
🔘фильтрации данных, поиска определенных значений или обработки данных по заданными условиями
🔘для работы с текстовыми данными (разбиение строк, поиск подстрок, замена символов и тд)
Пример:
⏩преобразование даты в определенный формат или вычисление дополнительных параметров на основе входных данных.
⏩входные параметры -- ID пользователя и ID ресурса, в ответе булевое значение, указывающее, имеет ли пользователь доступ к этому ресурсу
〰️Минусы
💩не эффективны в сложных запросах
💩на больших объемах данных могут привести к низкой производительности
💩отладка может быть трудной из-за изоляции от основного кода
💩могут зависеть от контекста сессии или окружения, что может привести к неожиданным результатам
✔️ Основные различия
Назначение
🟡процедуры -- для выполнения последовательности операций и изменения данных в БД
🔵функции -- для выполнения вычислений и возвращения результата
Возвращаемые значения
🟡процедуры могут возвращать 0 или более значений или изменять состояние БД
🔵функции возвращают только одно значение
Типы вызовов
🟡процедуры -- как отдельными операторами SQL, так и из других процедур и функций.
🔵функции -- вызываются обычно внутри запросов SQL или в выражениях, где нужно вычислить значения
ХП и пользовательские функции могут использоваться не только в БД, а еще в:
🟣приложениях на стороне сервера: могут быть частью серверных приложений, написанных на Java, C#, Python и др. Используются для обработки данных на сервере перед отправкой их клиенту.
🟣интеграциях в веб
🟣интеграциях с внешними системами, такими как API, сервисы и внешние БД, чтобы обрабатывать данные и для взаимодействия между приложениями и платформами.
#бд