Title: Procedimientos almacenados en PostgreSQL
Course: 2025 - LISI - Base de Datos Avanzadas 3-3 > Section: Unidad 1 - Comandos avanzados en RDB

Procedimientos almacenados en PostgreSQL

1) ¿Qué es un procedimiento almacenado?

Un procedimiento almacenado es un bloque de código que vive en el servidor de base de datos y que se invoca con CALL para ejecutar lógica (una o varias sentencias SQL, control de flujo, validaciones, etc.).
En PostgreSQL el soporte nativo de CREATE PROCEDURE existe desde la versión 11 (2018). A diferencia de las funciones, los procedimientos pueden controlar transacciones (COMMIT/ROLLBACK) cuando se ejecutan con CALL (fuera de un bloque BEGIN; … COMMIT; del cliente).

2) Diferencias: procedimiento vs. función (PostgreSQL)

Aspecto | Procedimiento | Función
Definición | CREATE PROCEDURE | CREATE FUNCTION
Invocación | CALL nombre(...); | En consultas: SELECT nombre(...);
Valor de retorno | No retorna valor por defecto; puede exponer resultados con parámetros OUT/INOUT o mediante consultas internas | Debe retornar un valor (escalar o conjunto)
Uso en sentencias SQL | No se usa dentro de SELECT/WHERE | Sí: puede usarse en expresiones SQL
Control de transacciones | Sí (COMMIT/ROLLBACK) cuando se llama con CALL y no se está dentro de una transacción externa | No (no puede ejecutar COMMIT/ROLLBACK)
Casos típicos | Orquestación de tareas, ETL, mantenimiento, jobs | Cálculos puros, validaciones, funciones de tabla

3) Tres casos de uso recomendados

1. Orquestación transaccional: varias operaciones que deben confirmarse o deshacerse juntas (ej. alta de alumno + inscripción a materias + registro en bitácora).
2. ETL / Lotes: cargas y transformaciones de datos programadas (con auditoría y control de errores).
3. Mantenimiento y administración: purgas, archivado y tareas periódicas (p. ej. recalcular saldos nocturnos).

4) Minisintaxis de referencia (no necesitas ejecutarla)

-- Definición
CREATE PROCEDURE nombre_proc(param1 tipo, param2 tipo INOUT)
LANGUAGE plpgsql
AS $$
BEGIN
    -- Lógica (INSERT/UPDATE/DELETE, IF/LOOP, etc.)
    -- En procedimientos sí se permite COMMIT/ROLLBACK si se invoca con CALL
END;
$$;

-- Ejecución
CALL nombre_proc(valor1, valor2);


Nota: En PostgreSQL, el control de transacciones dentro del procedimiento solo es válido cuando se usa CALL y la llamada no está envuelta por una transacción externa del cliente.

5) Ejemplo ilustrativo (breve)

-- Bitácora simple para auditoría
CREATE TABLE auditoria_acciones(
    id SERIAL PRIMARY KEY,
    accion TEXT,
    realizado_en TIMESTAMP DEFAULT now()
);

-- Procedimiento: alta de alumno con registro en bitácora
CREATE PROCEDURE alta_alumno(p_nombre TEXT, p_carrera TEXT)
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO alumno(nombre, carrera) VALUES (p_nombre, p_carrera);
    INSERT INTO auditoria_acciones(accion) VALUES ('Alta alumno: ' || p_nombre);
    -- (Opcional) COMMIT;  -- si se invoca con CALL y sin transacción externa
END;
$$;

-- Llamada
CALL alta_alumno('María López','Informática');


(El ejemplo muestra la idea de lógica de negocio + auditoría. En clase podrás extenderlo con validaciones, manejo de errores y transacciones.)