logo

¿Qué es el cursor en SQL?

Cursor es una Memoria Temporal o Estación de Trabajo Temporal. Es asignado por Base de datos Servidor al Momento de Realizar operaciones DML (Lenguaje de Manipulación de Datos) sobre la Mesa por parte del Usuario. Los cursores se utilizan para almacenar tablas de bases de datos.

Hay 2 tipos de cursores: cursores implícitos y cursores explícitos. Estos se explican a continuación.

  1. Cursores implícitos: Los cursores implícitos también se conocen como cursores predeterminados de SQL SERVER. Estos cursores son asignados por SQL SERVER cuando el usuario realiza operaciones DML.
  2. Cursores explícitos: Los cursores explícitos son creados por los usuarios siempre que el usuario los requiera. Los cursores explícitos se utilizan para recuperar datos de la tabla fila por fila.

¿Cómo crear un cursor explícito?

  1. Declarar objeto de cursor

Sintaxis:



DECLARAR nombre_cursor CURSOR PARA SELECCIONAR * DESDE nombre_tabla

Consulta:

DECLARE s1 CURSOR FOR SELECT * FROM studDetails>

2. Abrir conexión del cursor

convertir cadena a json java

Sintaxis:

ABRIR conexión_cursor

Consulta:

OPEN s1>

Obtener datos del cursor Hay un total de 6 métodos para acceder a los datos desde el cursor. Son los siguientes:

  1. PRIMERO se utiliza para recuperar solo la primera fila de la tabla de cursores.
  2. ÚLTIMO se utiliza para recuperar solo la última fila de la tabla de cursores.
  3. PRÓXIMO se utiliza para recuperar datos en dirección directa desde la tabla del cursor.
  4. PREVIO se utiliza para recuperar datos en dirección hacia atrás desde la tabla del cursor.
  5. ABSOLUTO sustantivo, masculino— se utiliza para buscar el n exactothfila de la tabla del cursor.
  6. PARIENTE sustantivo, masculino— se utiliza para recuperar los datos de forma incremental y decremental.

Sintaxis:

BUSCAR SIGUIENTE/PRIMERO/ÚLTIMO/ANTERIOR/ABSOLUTO n/RELATIVO n DESDE nombre_cursor

Consulta:

FETCH FIRST FROM s1 FETCH LAST FROM s1 FETCH NEXT FROM s1 FETCH PRIOR FROM s1 FETCH ABSOLUTE 7 FROM s1 FETCH RELATIVE -2 FROM s1>
  • Cerrar conexión del cursor

Sintaxis:

CERRAR nombre_cursor

Consulta:

CLOSE s1>
  • Desasignar memoria del cursor

Sintaxis:

DEASIGNAR nombre_cursor

Consulta:

DEALLOCATE s1>

¿Cómo crear un cursor implícito?

Un cursor implícito es un cursor que PL/SQL crea automáticamente cuando ejecuta una instrucción SQL. No es necesario declarar ni abrir explícitamente un cursor implícito. En cambio, PL/SQL administra el cursor detrás de escena.

Para crear un cursor implícito en PL/SQL, simplemente necesita ejecutar una instrucción SQL. Por ejemplo, para recuperar todas las filas de la tabla EMP, puede utilizar el siguiente código:

Consulta:

BEGIN FOR emp_rec IN SELECT * FROM emp LOOP DBMS_OUTPUT.PUT_LINE('Employee name: ' || emp_rec.ename); END LOOP; END;>

En PL/SQL, cuando realizamos INSERTAR , ACTUALIZAR o BORRAR operaciones, se crea automáticamente un cursor implícito. Este cursor contiene los datos que se insertarán o identifica las filas que se actualizarán o eliminarán. Puede referirse a este cursor como el cursor SQL en su código. Este cursor SQL tiene varios atributos útiles.

  1. %FOUND es verdadero si la operación SQL más reciente afectó al menos a una fila.
  2. %NOTFOUND es verdadero si no afectó a ninguna fila.
  3. %ROWCOUNT devuelve el número de filas afectadas.
  4. %ISOPEN comprueba si el cursor está abierto.

Además de estos atributos, %BULK_ROWCOUNT y %BULK_EXCEPTIONS son específicos de la declaración FORALL, que se utiliza para realizar múltiples operaciones DML a la vez. %BULK_ROWCOUNT devuelve el número de filas afectadas por cada operación DML, mientras que %BULK_EXCEPTION devuelve cualquier excepción que haya ocurrido durante las operaciones.

Consulta:

CREATE TABLE Emp( EmpID INT PRIMARY KEY, Name VARCHAR(50), Country VARCHAR(50), Age int(2), Salary int(10) ); -- Insert some sample data into the Customers table INSERT INTO Emp (EmpID, Name,Country, Age, Salary) VALUES (1, 'Shubham', 'India','23','30000'), (2, 'Aman ', 'Australia','21','45000'), (3, 'Naveen', 'Sri lanka','24','40000'), (4, 'Aditya', 'Austria','21','35000'), (5, 'Nishant', 'Spain','22','25000'); Select * from Emp;>

Producción:

img1

Este programa actualiza una tabla aumentando el salario de cada empleado en 1500. Después de la actualización, el atributo SQL%ROWCOUNT se utiliza para saber cuántas filas se vieron afectadas por la operación.

Consulta:

DECLARE total_rows number; BEGIN UPDATE Emp SET Salary = Salary + 1500; total_rows := SQL%ROWCOUNT; dbms_output.put_line(total_rows || ' rows updated.'); END;>

Producción:

5 Emp selected PL/SQL procedure successfully completed.>

Excepciones del cursor SQL

Siempre que ejecutamos una consulta SQL existe la posibilidad de que se produzca un error inesperado. El cursor recorre cada conjunto de filas para regresar en una consulta SQL.

Hay algunas excepciones muy populares:

  1. Valor duplicado: Este tipo de error ocurre cuando el cursor intenta insertar un registro o tupla que ya existe en la base de datos. Este tipo de errores se pueden evitar manejando la configuración de error adecuada.
  2. Estado del cursor no válido: Siempre que el cursor esté en un estado no válido, este tipo de error se mostrará como un error.
  3. Tiempo de espera de bloqueo: Esto ocurre cuando el cursor intenta obtener un bloqueo en una fila o tabla pero el bloqueo ya está retenido por otra transacción.

Necesidad de cursor en un servidor SQL

  1. Los cursores nos permiten procesar datos fila por fila, lo que puede resultar útil cuando necesitamos realizar cálculos complejos o transformaciones en los datos.
  2. Los cursores nos permiten iterar sobre un conjunto de resultados varias veces, lo que puede resultar útil cuando necesitamos realizar varias operaciones con los mismos datos.
  3. Los cursores pueden resultar útiles cuando necesitamos unir varias tablas con relaciones complejas, como al procesar estructuras de datos jerárquicas o al realizar consultas recursivas.
  4. Los cursores nos permiten realizar operaciones como actualizar, eliminar o insertar registros en función de alguna condición o criterio.
  5. Los cursores son especialmente útiles cuando se procesan datos de varias tablas donde las relaciones no son sencillas.

Limitaciones del cursor de SQL Server

Como un cursor tiene algunas limitaciones, sólo debe usarse cuando no haya otra opción. Estas restricciones incluyen:

  1. Al procesar datos, impone bloqueos en un subconjunto o en toda la tabla.
  2. La tabla de actualizaciones del cursor registra una fila a la vez, lo que ralentiza su rendimiento.
  3. Si bien los bucles son más lentos que los cursores, tienen más gastos generales.
  4. Otro factor que influye en la velocidad del cursor es la cantidad de filas y columnas que aparecen en el cursor.

PREGUNTAS MÁS FRECUENTES:

P.1 ¿Cómo se pueden evitar los cursores?

Respuesta:

La función principal de los cursores es la navegación en la tabla fila por fila. Los siguientes son algunos métodos simples para evitar cursores:

P.2 ¿Cómo utilizar el bucle While en el cursor SQL?

Respuesta:

Usar un bucle while, que permite la inserción de un conjunto de resultados en la tabla temporal, es la forma más sencilla de evitar la necesidad de un cursor.

P.3 ¿Qué son las funciones definidas por el usuario en el cursor SQL?

Respuesta:

A veces, el conjunto de filas resultante se calcula utilizando cursores. Podemos lograr esto empleando una función definida por el usuario que cumpla con las especificaciones.

P.4 ¿Uso de uniones con cursor SQL?

Respuesta:

En los casos en los que es necesario procesar registros grandes, la unión reduce la cantidad de líneas de código procesando solo aquellas columnas que cumplen con la condición especificada.