Es 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.
2. 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.
.
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 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
5. 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
6. 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
7. 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