Saltar al contenido principal
Avanzado
20 min de lectura

Procedures

Procedimientos almacenados con lógica de negocio

Los procedimientos almacenados (PROCEDURE) son bloques de código que se ejecutan en el servidor de la base de datos.

Crear un procedimiento

sql
1CREATE OR REPLACE PROCEDURE transferir_fondos(2    cuenta_origen INT,3    cuenta_destino INT,4    monto DECIMAL5)6LANGUAGE plpgsql7AS $$8BEGIN9    -- Verificar saldo suficiente10    IF (SELECT saldo FROM cuentas WHERE id = cuenta_origen) < monto THEN11        RAISE EXCEPTION 'Saldo insuficiente';12    END IF;13    14    -- Realizar transferencia15    UPDATE cuentas SET saldo = saldo - monto WHERE id = cuenta_origen;16    UPDATE cuentas SET saldo = saldo + monto WHERE id = cuenta_destino;17    18    -- Registrar transacción19    INSERT INTO transacciones (cuenta_origen, cuenta_destino, monto)20    VALUES (cuenta_origen, cuenta_destino, monto);21END;22$$;

Ejecutar procedimiento

sql
1CALL transferir_fondos(1, 2, 500.00);

Diferencia con funciones

  • PROCEDURE: No devuelve valor, usa CALL
  • FUNCTION: Devuelve valor, se usa en SELECT
  • PROCEDURE: Soporta transacciones internas
  • FUNCTION: No soporta COMMIT/ROLLBACK
  • Sintaxis

    Sintaxis
    sql
    1CREATE [OR REPLACE] PROCEDURE nombre(parámetros)2LANGUAGE plpgsql3AS $$4BEGIN5    -- lógica6END;7$$;

    Ejemplos

    Procedimiento de registro

    Registrar usuario con validación

    Ejemplo
    sql
    1CREATE OR REPLACE PROCEDURE registrar_usuario(2    p_nombre TEXT,3    p_email TEXT,4    p_edad INT5)6LANGUAGE plpgsql7AS $$8BEGIN9    IF EXISTS (SELECT 1 FROM usuarios WHERE email = p_email) THEN10        RAISE EXCEPTION 'El email ya está registrado';11    END IF;12    13    INSERT INTO usuarios (nombre, email, edad)14    VALUES (p_nombre, p_email, p_edad);15END;16$$;17 18CALL registrar_usuario('Nuevo', 'nuevo@email.com', 25);

    Resultado:

    CALL