Подпрограммы в SQL бывают двух видов:
CALL/EXEC и не всегда используются в select-прослойке.Важно:
Пример скалярной функции (PostgreSQL):
CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- использование: SELECT *, get_tax(price) AS tax FROM product;
Пример хранимой процедуры (SQL Server):
CREATE PROCEDURE add_employee(@name NVARCHAR(100), @salary INT, @emp_id INT OUTPUT) AS BEGIN INSERT INTO employees (name, salary) VALUES (@name, @salary); SET @emp_id = SCOPE_IDENTITY(); END; DECLARE @id INT; EXEC add_employee 'John', 100000, @id OUTPUT;
Можно ли использовать хранимую процедуру напрямую в SELECT?
Часто отвечают "да", но это неверно.
Ответ:
EXEC/CALL), а вот функции — можно использовать в SELECT.История
Проект: Система первичного учета, реализация отчетов. Ошибка: Вместо функции написали процедуру для вычисления суммы —SELECT не работал, пришлось переписывать всю логику пользователских отчетов.
История
Проект: ERP-система с внешними параметрами. Ошибка: Для процедуры не задали OUT-ключ, в результате клиент не мог узнать ID добавленной записи, интеграция "сломалась".
История
Проект: Финансовый сервис с рассчетами налога по разным правилам. Ошибка: Использовали скалярную функцию в массовом запросе без теста на производительность — запрос затормозил обработку таблицы из-за построчного вызова (не оптимизированный план).