Inicio > Transact-SQL > Creando cursores en Transact-SQL

Creando cursores en Transact-SQL


Un cursor es una variable que nos permite recorrer con un conjunto de resultados obtenidos por una sentencia select.

Se debe seguir los siguientes pasos para trabajar con cursores :

Declarar el cursor, utilizando DECLARE
Abrir el cursor, utilizando OPEN
Leer los datos del cursor, utilizando FETCH … INTO
Cerrar el cursor, utilizando CLOSE
Liberar el cursor, utilizando DEALLOCATE

Valores devueltos por @@FETCH_STATUS

0 –> La instrucción FETCH se ejecutó correctamente.
-1 –> La instrucción FETCH no se ejecutó correctamente o la fila estaba más allá del conjunto de resultados.
-2 –> Falta la fila recuperada.

Es posible especificar [ LOCAL | GLOBAL ]
LOCAL
Específica que el ámbito es local para el proceso por lotes, procedimiento almacenado o desencadenador en que se creó el cursor.
GLOBAL
Especifica que el ámbito es global para la conexión. Es posible hacer referencia al nombre del cursor en cualquier procedimiento almacenado o proceso por lotes que se ejecute en la conexión.

DECLARE cAlumnos CURSOR LOCAL FOR
SELECT Id, Nombre, Apellido FROM ALUMNO

DECLARE cAlumnos CURSOR GLOBAL FOR
SELECT Id, Nombre, Apellido FROM ALUMNO

Ejemplo : Se lee la tabla Alumnos , se la pasa a un cursor y se le recorre.

— Declaracion de variables para el cursor
DECLARE @Id int, @Nombre varchar(50), @Apellido varchar(50)

— Declaración del cursor
DECLARE cAlumnos CURSOR FOR
SELECT Id, Nombre, Apellido FROM ALUMNOS

— Apertura del cursor
OPEN cAlumnos

— Lectura de la primera fila del cursor
FETCH cAlumnos INTO @id, @Nombre, @Apellido
WHILE (@@FETCH_STATUS = 0 )
BEGIN
      PRINT @Nombre + ‘ ‘ + @Apellido
      — Lectura de la siguiente fila del cursor
     FETCH cAlumnos INTO @id, @Nombre, @Apellido
END

— Cierre del cursor
CLOSE cAlumnos

— Liberar los recursos
DEALLOCATE cAlumnos

SCROLL: Especifica que están disponibles todas las opciones de recuperación (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE).

Si no se especifica SCROLL en una instrucción DECLARE CURSOR la única opción de recuperación que se admite es NEXT.

No es posible especificar SCROLL si se incluye también FAST_FORWARD.

Si se incluye la opción SCROLL, la forma en la realizamos la lectura del cursor varia, debiendo utilizar la siguiente sintaxis:
FETCH [ NEXT | PRIOR | FIRST | LAST | RELATIVE | ABSOLUTE ] FROM < INTO

— Declaracion de variables para el cursor
DECLARE @Id int, @Nombre varchar(50), @Apellido varchar(50)

— Declaración del cursor
DECLARE cAlumnos CURSOR SCROLL FOR
SELECT Id, Nombre, Apellido FROM ALUMNOS

— Apertura del cursor
OPEN cAlumnos

— Lectura de la primera fila del cursor
FETCH NEXT FROM cAlumnos INTO @id, @Nombre, @Apellido

WHILE (@@FETCH_STATUS = 0 )
BEGIN
     PRINT @Nombre + ‘ ‘ + @Apellido
    — Lectura de la siguiente fila del cursor
    FETCH NEXT FROM cAlumnos INTO @id, @Nombre, @Apellido
END

— Lectura de la fila anterior
— FETCH PRIOR FROM cAlumnos INTO @id, @Nombre, @Apellido

— Cierre del cursor
CLOSE cAlumnos

— Liberar los recursos
DEALLOCATE cAlumnos

Para actualizar datos de un cursor se debe especificar FOR UPDATE después de la sentencia SELECT en la declaración del cursor, y WHERE CURRENT OF <nombre_cursor> en la sentencia UPDATE tal y como muestra en el ejemplo :

— Declaracion de variables para el cursor
DECLARE @Id int, @Nombre varchar(50), @Apellido varchar(50)

— Declaración del cursor
DECLARE cAlumnos CURSOR SCROLL FOR
SELECT Id, Nombre,Apellido FROM ALUMNOS FOR UPDATE

— Apertura del cursor
OPEN cAlumnos

— Lectura de la primera fila del cursor
FETCH cAlumnos INTO @id, @Nombre, @Apellido

WHILE (@@FETCH_STATUS = 0 )
BEGIN
      PRINT @Nombre + ‘ ‘ + @Apellido

     UPDATE Alumnos
     SET APELLIDO = isnull(@APELLIDO,”) + ‘ – Modificado’
     WHERE CURRENT OF cAlumnos
     — Lectura de la siguiente fila del cursor
     FETCH cAlumnos INTO @id, @Nombre, @Apellido
END

— Cierre del cursor
CLOSE cAlumnos

— Liberar los recursos
DEALLOCATE cAlumnos

Categorías:Transact-SQL
  1. 11 diciembre 2011 a las 2:57 pm

    bueno el codigo… luarsoft…

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: