Hola qué tal YouTube videntes Bienvenidos a otra entrega de este curso de sql server vamos ahora a empezar a trabajar con los cursores de sql y Qué son los cursores en sql Pues los cursores son objetos que nos permiten recorrer filas de resultados de consultas de forma secuencial son funciones que nos proporcionan una forma de procesar registros de uno a uno en un digamos conjunto los resultados lo que nos es útil en situaciones en donde necesitamos un control detallado sobre el procesamiento de datos los cursores se utilizan en casos en los que no se puede
o no se debe realizar una operación eh sobre un conjunto de datos Y es necesario procesar las filas individualmente son muy útiles para cálculos complicados lógicas de negocios o actualizaciones detalladas en filas de de tablas Existen varios tipos de cursores tenemos los cursores de solo lectura que esto se usan para recorrer un conjunto de resultados Pero estos no realizan modificaciones y las filas de las tablas en los que se usan están también los cursores de actualización que esto sí permite realizar modificaciones en las filas Tenemos también los cursores de inserción que son para inserción de
datos en Tablas Tenemos los cursores de combinación que permiten combinar múltiples conjuntos de resultados y generar como una especie de reporte como si fuera un solo entonces Vámonos a nuestro management estudio vamos a ir viendo ejemplos de Estos tipos de cursores como funcionan y para qué nos son útiles lo primero que vamos a hacer es crear un cursor de tipo solo lectura vamos a ver cómo se crean estos cursores Y qué utilidad tienen vamos a trabajar con nuestra tabla de productos aquí está la mía y lo primero que vamos a hacer es un cursor para
recorrer esta tabla debo aclarar que realmente los cursores no se utilizan para recorrer tablas pero nos va a servir para entender cómo funcionan para entender su estructura Entonces lo primero que vamos a necesitar es una variable y si se trata de variables como ya saben tenemos que crear nuestra sección de declaración a mi variable Yo la voy a llamar descripción va a ser de tipo numérico voy a colocar aquí 6,2 cierro paréntesis punto y coma Entonces para qué creamos esta variable esta variable nos va a servir para guardar los registros de recorrido del cursor ya
veremos cómo Entonces ahora aquí creamos de nuevo una subsección de declaración y aquí voy ahora a crear el nombre de mi cursor voy a declarar mi cursor a este cursor yo lo voy a llamar por ejemplo como información de producto no entonces Aquí voy a colocar cursor para definir el tipo de variable que es es una variable de tipo cursor entonces aquí coloco la instrucción Ford y aquí debajo coloco Select precio unidad productos continuo aquí debajo y colocó y Open info y aquí ahora coloco fecha next from info into y aquí ahora colocó arroba descripción
continúo aquí debajo abro un bucle While coloco ahora doble arroba fecha status igual 0 aquí abro una sección de ejecución y aquí digo print arroba descripción y aquí ahora coloco fecha next from y ahora colocó proot hondo score info into arroba descripción de nuevo justo así y aquí debajo ahora coloco en luego de colocar este en continuo aquí debajo y ahora colocó close info y aquí ahora colocó delocate pero de nuevo info y listo con esto ya he creado mi cursor procedo Entonces ahora a explicar qué es todo esto que yo he hecho aquí lo
primero que necesitamos para un cursores declarar una variable que va a manejar nuestros registros para todo el trabajo Que va a ser un cursor necesitamos una variable donde ir administrando los registros con los que vamos a trabajar Recuerden que el cursor se va a aplicar a nuestros registros nuestras tablas y esos registros necesitan un objeto en el cual moverse a través de su extracción su consulta etcétera para eso es esta variable entonces aquí yo declaro una variable del tipo de dato con el que voy a trabajar este tipo de datos de esta variable debe ser
el mismo tipo de dato que tengo en mi tabla en este caso qué es lo que va a hacer este cursor este cursor me va a traer todos los precios de los artículos de mi productos este campo es el que se va a consultar por lo tanto este tipo de dato que tiene este campo debe ser el mismo tipo de dato de mi variable que es numérica 6,2 Recuerden que si no saben Cuál es el tipo de dato que tiene cada campo se van a su sección a la tabla en su base de datos buscan
el nombre de su tabla en este caso productos buscan las columnas y aquí está precio unidad que es el campo que estoy utilizando como Ven aquí es numeric 6,2 debe ser Exactamente igual de lo contrario van a tener errores en la ejecución entonces luego que yo Declaro la variable que va a administrar mis registros creo una sección de declaración y ahora declaro mi cursor como si fuera declarando una variable Este es el nombre que tiene el cursor pero a la vez es una variable de tipo cursor Entonces mi cursor yo lo quiero llamar broad info
luego colocó entonces cursor para decir que esta variable de tipo cursor eso es lo que hago aquí ya el sistema con esto sabe que estoy creando un cursor eso se hace dentro de una sección de declaración ahora coloco for al colocar Ford estoy diciéndole al sistema lo que quiero que haga mi cursor el recorrido que yo quiero que haga en este caso yo le estoy diciendo seleccióname todos los registros de mi campo precio unidad de mi tabla productos que va a ser el sistema al colocar este Ford el cursor va a almacenar todos los registros
del campo precio unidad por lo tanto este Select si hacemos este Select individual si sombreamos aquí y ejecutamos fíjense como yo tengo todos los precios de los productos de mi tabla productos entonces colocando protein info cursor for y luego haciendo este Select estoy introduciendo todos estos valores en mi cursor prop info aquí ya todos esos valores están ahí luego ahora entonces procedo hacer un Open que yo hago con este Open estoy abriendo mi cursor cuando yo coloco Open y el nombre de mi cursor le estoy diciendo al sistema quiero extraer la información que ahí tienes
que en este caso sería el Select precio unidad de mi tabla productos entonces aquí digo Open info abro el cursor luego que mi cursor ya está abierto Entonces ahora hago un fetch y qué es este fecha este fecha es una extracción de cada registro que está dentro de mi cursor que aquí ya se abrió entonces colocó fecha y ahora coloco next from frot info este next Front va a ir saltando de registro en registro va a ir buscando cada valor que está dentro del cursor eso es lo que hace este next from extrae el siguiente
valor de mi cursor Pro info y luego colocó into arroba descripción lo que hace esta línea Es que después que abro mi cursor extrae cada registro que está ahí dentro y lo va introduciendo dentro de mi variable descripción que es la que declaramos aquí arriba por eso ven la importancia de que tenga el mismo tipo de dato que el campo del que va a obtener los datos si aquí yo hubiera colocado otro tipo de datos ya aquí esto fuera un problema porque no iba a ser compatible entonces extrae cada registro de producto info y lo
coloca dentro de la variable arroba descripción ahora coloco un While para que el sistema haga el siguiente proceso y Qué significa este While fecha status igual 0 este doble arroba fecha status que está aquí es una variable global que mantiene el estado del último fecha ejecutado en el cursor es decir verifica la extracción aquí recuerden luego que creamos el cursor le pasamos todos los datos pues tenemos que abrirlo cuando lo abrimos empezamos aquí a extraer los datos y meterlos en la variable luego entonces el sistema va con este fecha estatus verificar esta extracción que se
está haciendo aquí al colocar igual 0 acá estamos diciendo que verifique si se ejecutó correctamente y se recuperó una fila es decir mientras esto sea igual a cero es decir mientras encuentre datos en la fila Esta es una propiedad de la variable fecha estatus si todo está bien Es decir si cuando yo aquí hago una extracción de datos de mi cursor y los colocó en mi variable y el sistema verifica que todavía hay datos correctos para extraer es decir fecha estatus = 0 Porque mientras aquí esté encontrando datos correctamente Esto va a ser cero Entonces
el sistema dice mientras el fecha estatus es decir la extracción de datos esté bien mientras sea igual a cero Eso es lo que significa esto aquí entonces realiza lo siguiente tráeme en pantalla lo que esté en mi variable arroba descripción entonces aquí el sistema me va me va a ir colocando en pantalla cada precio de artículo a medida que lo va encontrando en la variable descripción Recuerden que este resultado que vemos aquí es este Select que hicimos acá sombreando esto y ejecutando por lo tanto ese debe ser el resultado pero aquí lo estamos haciendo con
un Select más adelante lo vamos a hacer con el cursor entonces mientras la extracción de filas esté bien mientras sea cero Pues ve imprimiendo en pantalla el resultado y pasa a extraer el siguiente valor y colócalo de nuevo en la variable descripción Eso significa esta fila porque aquí va a ser el primero aquí hace una primera extracción del valor que encuentra Y si todo está bien Qué es lo que significa esto pues entonces imprime ese valor y vuelve entonces a extraer el siguiente valor como es un While Vuelve aquí arriba y dice todo sigue bien
perfecto imprime ese valor y ya y extrae el otro todo sigue bien imprímelo y busca el otro y así lo va haciendo mientras vayan quedando filas cuando llega al final aquí cuando ya no hay más filas finaliza y ahora Cerramos el cursor colocamos Close prod info Recuerden que aquí lo abrimos Open info pero eso es un proceso de la base de datos Y aunque pues no sabemos administración de bases de datos lo que estamos aprendiendo es sql abrir un cursores abrir un proceso y los procesos no pueden quedarse abiertos en una base de datos Porque
se cuelgan Entonces tenemos que cerrar el cursor aquí cerramos y el sistema ya no está entonces pendiente a ese proceso posteriormente colocamos de locate y Qué significa de locate Por qué colocamos esto aquí este de locate se usa para liberar recursos asociados al cursor porque ya aquí el cursor no debe seguir no va a seguir siendo utilizado Entonces tenemos que colocar de locate cuando colocamos aquí del Ok estamos optimizando los procesos de la base de datos y ayudando a la gestión correcta de la memoria y los recursos del sistema es decir si yo quito este
de lo que de aquí el cursor va a trabajar correctamente pero colocando este de locate aquí estoy ayudando a optimizar el uso de recursos de mi base de datos Entonces ya tengo todo esto listo ahora simplemente así sombreamos toda esta instrucción y la ejecutamos aquí me da un error y me dice que debo declarar la variable escalar descripción dice aquí línea 7 voy a verificar Aquí está aquí está mi variable en la línea 7 y aquí está el error la escribí mal puse desde opción está mal es descripción aquí Me falta una r Ahora sí
si ahora sombreo de nuevo y ejecuto aquí está el resultado de mi cursor me está trayendo todos los precios de mi tabla productos eso fue lo que hice repasando creo una variable donde voy a guardar mis registros del mismo tipo de dato de los registros que quiero traer declaro el nombre de mi cursor que va a realizar la operación con una variable que se llama cursor colocó un Ford para indicar la operación que voy a hacer preparo aquí mi operación que es seleccionar el precio unidad de mi tabla productos y cuando termino abro el cursor
que ya tiene todos estos datos dentro luego extraigo aquí el primer dato y lo coloco en mi variable descripción creo un bucle While y le digo al sistema que verifique con fecha estatus si la extracción está correcta si tiene datos y todo está bien por lo tanto coloco igual a cero Porque si todo está bien es el valor es cero entonces mientras ese valor sea cero que es lo que digo aquí dentro de una sección de ejecución le digo al sistema imprime ese primer valor y continúa extrayendo el próximo valor y éntralo en la variable
de descripción si todo está bien imprime ese valor entralo de nuevo en la variable y así hasta llegar al final cierra el cursor y vamos y vamos a decir pues de desanclalo ese proceso que tiene ese cursor porque no lo no se va a usar más y el resultado es este todos los precios de mi tabla productos si se fijan algo característico los cursores no nos traen Generalmente nombre de Campos aquí como vemos no hay un encabezado no hay un nombre de campo por ejemplo en la tabla es precio unidad aquí no aparece ese nombre
de campo los cursores no lo hacen eso es una característica propia de los cursores de sql Incluso si yo intento poner un alias por ejemplo aquí Select precio unidad a precio from productos si yo intento eh hacer esto sombreo y ejecuto del mismo modo como ven no viene ningún nombre de campo esto es una característica propia de sql Pero esto no es inconveniente porque los cursores no se usan para traer datos en salida de datos por consola aquí por ejemplo en management Studio un cursor se crea para que una aplicación generó resultado en una interfaz
de usuario en una ventana en donde ya pues quien desarrolla esa aplicación tiene todo listo para mostrarle todos los detalles al usuario por lo tanto si no trae nombre de campo como vemos aquí pues es irrelevante Entonces eso va a ser todo lo vamos a dejar hasta aquí en esta primera parte de cursores en sql server más adelante Seguiremos trabajando con los cursores viendo ejemplos más complejos y más útiles nos vemos en una siguiente entrega