Найти в Дзене
IT-Volchkov

Хранимые процедуры и пользовательские функции в БД

📌Кратко

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

✔️Хранимые процедуры

Это набор инструкций, которые выполняют любые операции с данными, сложную логику или задачи на стороне сервера БД

🟡компилируются один раз и хранятся на сервере

🟡могут содержать циклы, условные операторы

🟡как в обычном коде в языках программирования, можно реализовать логику работы с данными

🟡могут принимать параметры и возвращать результаты, но могут и не возвращать

Как используются?

🔘выполнение сложных операций (сортировка, фильтрация и агрегация), сложной бизнес-логики

🔘могут включать несколько операций, которые выполняются как одна транзакция

🔘последовательное выполнение нескольких SQL-команд

🔘регулярно выполняющихся операций, требующих быстрого повторного исполнения

🔘обеспечивают защиту, выполняясь на стороне сервера БД, а также контролируют доступ и выполнение операций. С помощью процедур можно реализовать логику доступа, проверки прав и аутентификации пользователей

Примеры

⏩процедура принимает ID сотрудника в качестве входного параметра и возвращает его имя из таблицы Employees

⏩процедура принимает данные о новом заказе (например, клиент, товары, количество) и добавляет соответствующую запись в базу данных.

⏩входной параметр -- ID заказа, процедура извлекает информацию о товарах в заказе и вычисляет стоимость всех товаров.

〰️ Минусы

💩 когда сложны, тяжело поддерживаемы, возникают проблемы с рефакторингом

💩могут создавать зависимость от конкретной СУБД — затрудняет масштабирование

💩хранение бизнес-логики в PLSQL ведет к созданию монолита. Его дальнейшее разбиение затрудняется

💩 отладка не всегда удобна, логирование и обработка ошибок выполняется вручную

✅ Пользовательские функции

Это фрагменты кода, предназначенные для выполнения конкретных операций или вычислений над данными

🔵принимают входные параметры, выполняют определенные вычисления и всегда возвращают результат

🔵не предназначены для изменения данных или выполнения транзакций

Как используются?

🔘 для сложных логических или арифметических операций

🔘возвращаемые значения используются в др. запросах / выражениях

🔘для использования операторах SQL (SELECT, WHERE и тд) для вычисления значений

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

🔘для работы с текстовыми данными (разбиение строк, поиск подстрок, замена символов и тд)

Пример:

⏩преобразование даты в определенный формат или вычисление дополнительных параметров на основе входных данных.

⏩входные параметры -- ID пользователя и ID ресурса, в ответе булевое значение, указывающее, имеет ли пользователь доступ к этому ресурсу

〰️Минусы

💩не эффективны в сложных запросах

💩на больших объемах данных могут привести к низкой производительности

💩отладка может быть трудной из-за изоляции от основного кода

💩могут зависеть от контекста сессии или окружения, что может привести к неожиданным результатам

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

Назначение

🟡процедуры -- для выполнения последовательности операций и изменения данных в БД

🔵функции -- для выполнения вычислений и возвращения результата

Возвращаемые значения

🟡процедуры могут возвращать 0 или более значений или изменять состояние БД

🔵функции возвращают только одно значение

Типы вызовов

🟡процедуры -- как отдельными операторами SQL, так и из других процедур и функций.

🔵функции -- вызываются обычно внутри запросов SQL или в выражениях, где нужно вычислить значения

ХП и пользовательские функции могут использоваться не только в БД, а еще в:

🟣приложениях на стороне сервера: могут быть частью серверных приложений, написанных на Java, C#, Python и др. Используются для обработки данных на сервере перед отправкой их клиенту.

🟣интеграциях в веб

🟣интеграциях с внешними системами, такими как API, сервисы и внешние БД, чтобы обрабатывать данные и для взаимодействия между приложениями и платформами.

#бд