Introducción a los cursores en SQL

Los cursores son espacios de trabajo temporales creados en la memoria para procesar algunos comandos SQL en un conjunto de datos. Definición demasiado complicada? Vamos a entenderlo Piense en los cursores como para cada bucle en SQL. Desea realizar una tarea en un conjunto de filas de datos, utiliza el cursor. Digamos que tiene una tabla de empleados que contiene el salario de cada empleado de la organización. Desea aumentar el salario de cada empleado en un cierto porcentaje. Aquí es donde usarías un cursor. 'El Cómo' ha sido ilustrado más adelante en el artículo.

Por lo tanto, los cursores crean un espacio de trabajo temporal con el conjunto seleccionado de filas y un puntero que apunta a la fila actual. Este conjunto de filas, en el que el cursor realizará la operación deseada, se denomina Conjunto de datos activo. El puntero recupera las filas del conjunto de resultados una por una. Luego puede realizar cualquier operación SQL una fila a la vez.

Cursores implícitos

Los cursores implícitos, como su nombre lo indica, son generados por el analizador SQL para consultas DML. Las consultas DML son consultas de manipulación de datos. Estas consultas manipulan o cambian los datos. No interfieren con la estructura o el esquema de la base de datos. Las consultas como SELECT, INSERT, UPDATE y DELETE generan un cursor implícito. Los cursores implícitos están ocultos para el usuario final.

Cursores explícitos

Los cursores explícitos son cursores generados por el usuario. Cuando un usuario indica al analizador SQL que cree un cursor para un conjunto activo, el cursor así creado se denomina cursor explícito. El conjunto activo se define mediante una consulta SELECT por parte del usuario. Cubriremos los cursores explícitos en detalle en este artículo.

Acciones del cursor: el ciclo de vida de un cursor

El ciclo de vida de un cursor generalmente involucra cinco etapas:

1. Declarar: el primer paso es declarar un cursor. Este paso le indica al sistema que genere un cursor con el conjunto de datos dado. El conjunto de datos se construye utilizando una instrucción SQL. En esta etapa, se crea el conjunto activo, pero el espacio de trabajo temporal del cursor aún no está abierto en la memoria.

2. Abrir: a continuación, se le indica al sistema que abra el cursor. En esta etapa, el espacio de trabajo temporal se carga en la memoria con el conjunto activo y se genera un puntero que apunta a la primera fila del conjunto activo.

3. Recuperar: este es el paso recurrente en todo el proceso. La fila actual apuntada por el puntero se recupera y la tarea deseada se realiza en los datos de la fila. El puntero se mueve a la siguiente fila del cursor.

4. Cerrar: después de que se realiza la manipulación de datos, el cursor debe cerrarse.

5. Desasignación: este es el paso final para eliminar el cursor y liberar la memoria, el procesador y otros recursos del sistema asignados al cursor.

Cursores explícitos - ¡En acción!

Bien, ahora tenemos una comprensión básica de qué son los cursores y cómo funcionan. Es hora de ensuciarnos las manos y crear un cursor explícito nosotros mismos.

La terminología de los cursores en SQL

Comprendamos las terminologías utilizadas en esta sintaxis.

Alcance del cursor

  • El alcance del cursor puede ser GLOBAL o LOCAL . Un cursor global está disponible en toda la conexión. Un cursor local tiene un alcance limitado solo a los procedimientos almacenados, las funciones o la consulta que contiene el cursor.
  • Esta es la característica específica de MS SQL Server. MySQL solo admite cursores locales.

Movimiento del cursor

  • MS SQL Server también ofrece la opción de configurar el movimiento del cursor. Puede ser el modo convencional Forward_Only que mueve el puntero desde la primera fila hasta la última línea por línea. O bien, puede desplazarse a la primera, última, anterior o siguiente fila.
  • Los cursores en MySQL no son desplazables.

Tipo de cursor

  • Un cursor puede ser estático ya que puede almacenar en caché el conjunto activo hasta la desasignación y puede hacer malabarismos hacia adelante y hacia atrás a través de este conjunto activo en caché. Un cursor puede avanzar rápido solo en modo estático.
  • También puede ser dinámico para permitir la adición o eliminación de filas en el conjunto activo mientras el cursor está abierto. Estos cambios no son visibles para otros usuarios del cursor en modo de conjunto de teclas. Los cursores en MySQL son solo fast_forward.

Cursor Lock

  • Los bloqueos de cursor son útiles en un entorno multiusuario. Bloquean la fila para que no haya dos usuarios que operen con los mismos datos simultáneamente. Esto asegura la integridad de los datos.
  • Un bloqueo de solo lectura indica que la fila no se puede actualizar.
  • Los bloqueos de desplazamiento bloquean la fila a medida que se recuperan en el cursor, lo que garantiza que la tarea se realice correctamente y que los datos actualizados estén disponibles fuera del cursor. Intentos optimistas para actualizar la fila sin ningún bloqueo. Por lo tanto, si la fila se ha actualizado fuera del cursor, la tarea no tendrá éxito.
  • MySQL solo admite bloqueos de solo lectura. Esto significa que MySQL no actualizará la tabla real, sino que copiará los datos para llevar a cabo los comandos de actualización.

Por lo tanto, vemos que estas opciones solo están disponibles en MS SQL Server. Esto hace que la sintaxis para los cursores MySQL sea aún más simple.

Ejemplo

Actualicemos ahora el salario de los empleados en nuestra tabla de Empleados.

Estaríamos utilizando los siguientes datos en estos cursores en el ejemplo de SQL.

Nuestro código de cursor sería el siguiente:

DECLARE @sal float
DECLARE @newsal float
DECLARE Emp_Cur CURSOR FOR SELECT Salary, Updated_Salary FROM Employees
OPEN Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
WHILE @@FETCH_STATUS = 0
BEGIN
SET @newsal = @sal*1.25
UPDATE Employees SET Updated_Salary = @newsal WHERE CURRENT OF Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, @newsal
END
CLOSE Emp_Cur
DEALLOCATE Emp_Cur

Y la salida después de ejecutar el comando del cursor anterior sería:

Conclusión: cursores en SQL

Por lo tanto, hemos visto qué son los cursores, cómo usarlos y dónde evitarlos. Los cursores demuestran ser una utilidad útil para los desarrolladores pero a costa del rendimiento. Por lo tanto, tenga cuidado cuando opte por los cursores.

Artículos recomendados

Esta es una guía de cursores en SQL. Aquí discutimos los tipos, el ciclo de vida y la terminología del cursor en SQL con ejemplos. También puede consultar nuestros otros artículos sugeridos:

  1. Tipos de combinaciones en SQL
  2. Comando de alteración de SQL
  3. Vistas SQL
  4. Herramientas de administración de SQL
  5. Tipos de cursores en PL / SQL
  6. Los 6 tipos principales de combinaciones en MySQL con ejemplos