Primero voy a colocar las instrucciones/variables importates relacionadas con este tema que se utilizan y descripción de las mismas:
Declare nombre_cursor for: sirve para declarar el cursor y hacer referencia sobre que consulta se realiza
Open nombre_cursor: sirve para iniciar el trabajo sobre el cursor que se desea operar
fetch next from nombre_cursor: sirve para correr un registro dentro del cursor
@@Fetch_status: indica el resultado de la ultima instrucción fetch realizada; 0 indica que todo funciono correctamente, -1 existió un error, -2 la fila captura no esta
Close nombre_cursor: cierra el trabajo sobre el cursor que se esta operando
Deallocate nombre_cursor: quita la referencia del nombre de cursor al cursor mencionado, cuando la ultima referencia la cursor a sido quitada el manejador de sql liberan los recursos asociados
Ejemplo:
En el siguiente ejemplo se tiene una tabla llamada "Tabla" la cual contiene campos Registro, año y nombre_tabla. Que previamente se habían creado y cargado con datos de años anteriores, para el año 2012 se actualizaron y se crearon los registros correspondientes y este cursor actualiza el nombre de la tabla para estos registros.
--variables donde guardo los resultados de la consulta
declare @numid as numeric
declare @tabla as varchar(250)
--declaracion de la tabla que se utiliza
Declare modTabla cursor for
select distinct Registro,nombre_tabla from Tabla
where anio <2012
--declaracion del cursor que se utiliza
Open modTabla
--inicio el recorrido del cursor
fetch next from modTabla
into @numid,@tabla --le indico que el resultado lo guarde en estas variables
while @@fetch_status =0 --mientras todo se ejecuta de manera correcta
begin --inicia el cursor
--realizamos los cambios correspondientes
Update Tabla
set nombre_tabla = @tabla
where registro=@numid
and anio=2012
--avanzamos otro registro
fetch next from modTabla
into @numid,@tabla
End --finaliza el cursor
--se cierrra el cursor
close modTabla
--se desliga el nombre del cursor con el cursor para que el manejador libere los recursos
deallocate modTabla
Cuando utilizar cursores
Los cursores son una herramienta que provee la mayoría de maneja dores de base de datos, criticados por algunos y muy utilizados por otros, como toda herramienta informática tiene ventajas y desventajas, algunos afirman que todo lo que se hace por cursores puede hacerse mediante otra técnica y que en ocasiones es mejor utilizar tablas temporales otros que es mejor usar cursores. Definitivamente existen procedimientos que se hace mas fácil utilizar cursores para su desarrollo pero puede verse afectado el rendimiento de la base de datos entonces cuando recomendaría usar cursores algunos pueden estar en desacuerdo.
Cuando te piden un reporte urgente.
Si el jefe llega y dice quiero un reporte de "··$"%·$%" dentro de una hora se puede evitar un poco perder tiempo en la programación utilizar un cursor y listo (si se tarda se puede echar la culpa al manejador de base de datos ;p)
Cuando no hay muchos registros.
En algún reporte que no implique revisar mas de 150 o 200 tuplas se puede recurrir a un cursor, siempre y cuando lo que se desea hacer dentro del cursor no es muy complicado de otra manera se puede afectar el rendimiento de la base de datos.
Para una acción aislada
Se necesita actualizar algo por algún motivo fuera de lo común por alguna razón especial en este caso hacer una actualización por cambio de año, creo se puede recurrir, con la salvedad que para tablas que no tengan demasiadas tuplas en sistemas críticos, en horas criticas por razones mas que evidentes.
En fin los cursores son una herramienta que disminuye la pensada al momento de realizar un procedimiento y es de analizar si conviene utilizarla o no ya sea por rendimiento o por que no das mas para implementar una mejor forma
Comentarios