En SQL Server un cursor puede definirse
como un elemento que representará a un
conjunto de datos determinado por una
consulta T-SQL, el cursor permitirá recorrer
fila a fila, leer y eventualmente modificar
dicho conjunto de resultados.
.
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
[;]
Transact-SQL Extended Syntax
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]
 Administración de Procedimientos Almacenados
(Creación, Modificación y Eliminación)
Creación
-- Declaracion de variables para el cursor
DECLARE @ Id int,
@ Nombre varchar(255),
@ 1 Apellido varchar(255),
@ 2 Apellido varchar(255),
@ NifCif varchar(20),
@ FxNacimiento datetime
-- Declaración del cursor
DECLARE cClientes CURSORFOR
SELECT Id,Nombre, 1 Apellido ,
Apellido2,NifCif, FxNacimiento
FROM CLIENTES
-- Apertura del cursor
OPEN cClientes
-- Lectura de la primera fila del cursor
FETCH cClientes INTO @id, @Nombre, @
1 Apellido ,
@ 2 Apellido , @NifCif, @FxNacimiento
WHILE (@@ _ FETCH STATUS = 0 )
BEGIN
PRINT @ Nombre+' '+ @ 1 Apellido +' '+ @
2 Apellido
-- Lectura de la siguiente fila del cursor
FETCH cClientes INTO @id, @Nombre, @
1 Apellido ,
@ 2 Apellido , @NifCif, @FxNacimiento
END
-- Cierre del cursor
CLOSE cClientes
-- Liberar los recursos
DEALLOCATE cClientes
Modificación
Para actualizar los datos de un cursor
debemos especificar FOR UPDATE
después de la sentencia SELECT en la
declaración del cursor y WHERE CURRENT
OF , en la sentencia UPDATE tal y como
muestra el siguiente ejemplo:
-- Declaración de variables para el cursor
DECLARE @ Id int,
@ Nombre varchar(255),
@ 1 Apellido varchar(255),
@ 2 Apellido varchar(255),
@ NifCif varchar(20),
@ FxNacimiento datetime
-- Declaración del cursor
DECLARE cClientes CURSORFOR
SELECT Id,Nombre, 1 Apellido ,
Apellido2,NifCif, FxNacimiento
FROM CLIENTES
FORUPDATE
-- Apertura del cursor
OPEN cClientes
-- Lectura de la primera fila del cursor
FETCH cClientes
INTO @id, @Nombre, @ 1 Apellido , @ 2
Apellido , @NifCif, @FxNacimiento
WHILE (@@ _ FETCH STATUS = 0 )
BEGIN
UPDATE Clientes
SET 2 APELLIDO = isnull(@ 2 Apellido ,'')+ '
- ' Modificado
WHERECURRENT OF cClientes
-- Lectura de la siguiente fila del cursor
FETCH cClientes
INTO @id, @Nombre, @ 1 Apellido , @ 2
Apellido ,
@NifCif, @FxNacimiento
END
-- Cierre del cursor
CLOSE cClientes
-- Liberar los recursos
DEALLOCATE cClientes
Eliminación:
CREATE Procedure DBPSRemoveTest_Sp
As
Begin
DECLARE TEST_CURSOR CURSOR FOR
SELECT * FROM Test DECLARE
@RetPeriod intDECLARE @AuthId Varchar(50)
OPEN TEST_CURSOR FETCH NEXT FROM TEST_CURSOR
INTO @RETPERIOD,@AUTHID
WHILE@@FETCH_STATUS=0 BEGIN BEGIN
delete from test where userid=@RetPeriod and
Username=@Authid
IF(@@ROWCOUNT=0)
PRINT 'Failed to delete the row from the table END
FETCH NEXT FROM TEST_CURSOR INTO
@RETPERIOD,@AUTHID END CLOSE TEST_CURSOR
DEALLOCATE TEST_CURSOR end
GO
Aprendimos a crear un cursor para la exploración de registro por
registro de un conjunto de registros. Este tipo de operación, puede
reducir el rendimiento de la aplicación, reducir la concurrencia,
disminuir el ancho de banda, bloquear el acceso a recursos, entre
otros; es por eso que se debe usar en situaciones muy especiales
y prestando particular atención con no afectar el desempeño de la
aplicación.
CONCLUSIONES
GRACIAS….

Cursores

  • 2.
    En SQL Serverun cursor puede definirse como un elemento que representará a un conjunto de datos determinado por una consulta T-SQL, el cursor permitirá recorrer fila a fila, leer y eventualmente modificar dicho conjunto de resultados. .
  • 3.
    DECLARE cursor_name [INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] Transact-SQL Extended Syntax DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;]
  • 4.
     Administración deProcedimientos Almacenados (Creación, Modificación y Eliminación) Creación -- Declaracion de variables para el cursor DECLARE @ Id int, @ Nombre varchar(255), @ 1 Apellido varchar(255), @ 2 Apellido varchar(255), @ NifCif varchar(20), @ FxNacimiento datetime -- Declaración del cursor DECLARE cClientes CURSORFOR SELECT Id,Nombre, 1 Apellido , Apellido2,NifCif, FxNacimiento FROM CLIENTES -- Apertura del cursor OPEN cClientes -- Lectura de la primera fila del cursor FETCH cClientes INTO @id, @Nombre, @ 1 Apellido , @ 2 Apellido , @NifCif, @FxNacimiento WHILE (@@ _ FETCH STATUS = 0 ) BEGIN PRINT @ Nombre+' '+ @ 1 Apellido +' '+ @ 2 Apellido -- Lectura de la siguiente fila del cursor FETCH cClientes INTO @id, @Nombre, @ 1 Apellido , @ 2 Apellido , @NifCif, @FxNacimiento END -- Cierre del cursor CLOSE cClientes -- Liberar los recursos DEALLOCATE cClientes
  • 5.
    Modificación Para actualizar losdatos de un cursor debemos especificar FOR UPDATE después de la sentencia SELECT en la declaración del cursor y WHERE CURRENT OF , en la sentencia UPDATE tal y como muestra el siguiente ejemplo: -- Declaración de variables para el cursor DECLARE @ Id int, @ Nombre varchar(255), @ 1 Apellido varchar(255), @ 2 Apellido varchar(255), @ NifCif varchar(20), @ FxNacimiento datetime -- Declaración del cursor DECLARE cClientes CURSORFOR SELECT Id,Nombre, 1 Apellido , Apellido2,NifCif, FxNacimiento FROM CLIENTES FORUPDATE -- Apertura del cursor OPEN cClientes -- Lectura de la primera fila del cursor FETCH cClientes INTO @id, @Nombre, @ 1 Apellido , @ 2 Apellido , @NifCif, @FxNacimiento WHILE (@@ _ FETCH STATUS = 0 ) BEGIN UPDATE Clientes SET 2 APELLIDO = isnull(@ 2 Apellido ,'')+ ' - ' Modificado WHERECURRENT OF cClientes -- Lectura de la siguiente fila del cursor FETCH cClientes INTO @id, @Nombre, @ 1 Apellido , @ 2 Apellido , @NifCif, @FxNacimiento END -- Cierre del cursor CLOSE cClientes -- Liberar los recursos DEALLOCATE cClientes
  • 6.
    Eliminación: CREATE Procedure DBPSRemoveTest_Sp As Begin DECLARETEST_CURSOR CURSOR FOR SELECT * FROM Test DECLARE @RetPeriod intDECLARE @AuthId Varchar(50) OPEN TEST_CURSOR FETCH NEXT FROM TEST_CURSOR INTO @RETPERIOD,@AUTHID WHILE@@FETCH_STATUS=0 BEGIN BEGIN delete from test where userid=@RetPeriod and Username=@Authid IF(@@ROWCOUNT=0) PRINT 'Failed to delete the row from the table END FETCH NEXT FROM TEST_CURSOR INTO @RETPERIOD,@AUTHID END CLOSE TEST_CURSOR DEALLOCATE TEST_CURSOR end GO
  • 7.
    Aprendimos a crearun cursor para la exploración de registro por registro de un conjunto de registros. Este tipo de operación, puede reducir el rendimiento de la aplicación, reducir la concurrencia, disminuir el ancho de banda, bloquear el acceso a recursos, entre otros; es por eso que se debe usar en situaciones muy especiales y prestando particular atención con no afectar el desempeño de la aplicación. CONCLUSIONES
  • 8.