Los subprogramas en SQL se dividen en dos tipos:
CALL/EXEC y no siempre se utilizan en la capa select.Importante:
Ejemplo de función escalar (PostgreSQL):
CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- uso: SELECT *, get_tax(price) AS tax FROM product;
Ejemplo de procedimiento almacenado (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;
¿Se puede usar un procedimiento almacenado directamente en SELECT?
A menudo se responde "sí", pero esto es incorrecto.
Respuesta:
EXEC/CALL), pero las funciones sí pueden ser utilizadas en SELECT.Historia
Proyecto: Sistema de contabilidad primaria, implementación de informes. Error: En lugar de una función, se escribió un procedimiento para calcular la suma — SELECT no funcionó, fue necesario reescribir toda la lógica de los informes de los usuarios.
Historia
Proyecto: Sistema ERP con parámetros externos. Error: No se definió la clave OUT para el procedimiento, como resultado, el cliente no pudo conocer el ID del registro añadido, la integración se "rompió".
Historia
Proyecto: Servicio financiero con cálculos de impuestos según diferentes reglas. Error: Se utilizó una función escalar en una consulta masiva sin prueba de rendimiento — la consulta ralentizó el procesamiento de la tabla debido a la llamada fila por fila (plan no optimizado).