Manejo de Cursores y Procesamiento Fila a Fila
El motor de una base de datos relacional está optimizado para procesar datos de forma declarativa y masiva (operaciones basadas en conjuntos o Set-based operations). Sin embargo, en ciertos procedimientos almacenados complejos (como cálculos acumulativos con lógica condicional ramificada, llamadas a servicios externos o migraciones paso a paso) es necesario recorrer los registros uno a uno.
Un cursor es un mecanismo procedural que permite iterar secuencialmente sobre las filas de un conjunto de resultados devuelto por una consulta SELECT.
1. Ciclo de Vida de un Cursor #
Todo cursor sigue un ciclo de 5 fases estructuradas:
1┌──────────────┐ ┌──────────┐ ┌────────────────┐ ┌───────────┐ ┌──────────────┐ 2│ 1. DECLARE │ ──► │ 2. OPEN │ ──► │ 3. FETCH (Loop)│ ──► │ 4. CLOSE │ ──► │ 5. DEALLOCATE│ 3│ Definir query│ │ Ejecutar │ │ Extraer fila │ │ Liberar │ │ Destruir │ 4└──────────────┘ └──────────┘ └────────────────┘ └───────────┘ └──────────────┘
DECLARE: Asocia el cursor a una consultaSELECTy reserva las variables de almacenamiento temporal.OPEN: Ejecuta la consulta y posiciona el puntero antes de la primera fila del conjunto resultante.FETCH: Extrae los valores de la fila actual hacia variables locales y avanza el puntero a la siguiente fila. Se repite dentro de un bucle hasta alcanzar el final del cursor (NOT FOUND).CLOSE: Cierra el cursor y libera la memoria de trabajo temporal asociada.DEALLOCATE: (En motores como SQL Server) elimina por completo la definición del cursor de la memoria.
2. Ejemplos de Implementación Multi-Motor #
3. ¿Cuándo usar Cursores vs. Operaciones Basadas en Conjuntos? #
WARNING
Regla de oro de rendimiento: Siempre que una tarea pueda resolverse con una sentenciaUPDATE,INSERT ... SELECTo funciones de ventana (WINDOW FUNCTIONS), debe evitarse el uso de cursores. Los cursores son órdenes de magnitud más lentos porque consumen memoria para el puntero y ejecutan cambios fila por fila.
| Escenario | Enfoque Recomendado | Razón |
|---|---|---|
| Actualizar salarios con un 5% de incremento | UPDATE empleados SET salario = salario * 1.05; | Resuelto en un solo pase de disco optimizado. |
| Enviar notificaciones push o emails a usuarios | Cursor con llamadas a colas externas | Requiere interacción paso a paso con sistemas externos. |
| Cálculo de balances acumulativos complejos | SUM(monto) OVER (ORDER BY fecha) | Las funciones de ventana operan en memoria sin bucles. |
Resumen del tema
Conceptos clave #
- Cursor: estructura de control procedural que permite iterar secuencialmente fila a fila sobre el conjunto de resultados de un
SELECT. - Fases:
DECLARE(definición),OPEN(ejecución),FETCH(extracción),CLOSE(liberación) yDEALLOCATE(destrucción). - Bucle de escape: condición
NOT FOUND/@@FETCH_STATUSpara detener la iteración al agotar las filas. - Trade-off de rendimiento: los cursores introducen sobrecarga de memoria y E/S; deben reservarse exclusivamente para tareas donde las sentencias basadas en conjuntos no sean viables.
Qué debes recordar #
Prioriza siempre las sentencias SQL basadas en conjuntos (UPDATE, JOIN, funciones de ventana); utiliza cursores solo cuando la lógica requiera efectos secundarios individuales fila por fila.