Hola qué tal.
Bienvenidos a este último capítulo de la sección de estor prosigue rutinas almacenadas y vamos a ver
ahora algo bastante complejo bastante nutritivo vamos a ir a nuestra rutina que tenemos grabada que
se llama ganancia ventas vamos a hacerle click no vamos a grabar esta vamos a ver si podemos achicar
algún espacio.
Bueno no importa vamos a estropear SI NO SE NO NOS VAMOS DE PANTALLA.
Bueno qué es lo que vamos a hacer aquí.
Nosotros vamos a usar cursores los cursores son tablas en memoria que crea el motor no son tablas reales
no son tablas que las va a grabar ni les va a dar un nombre son tablas en memoria que nos va a permitir
recorrer sus registros y procesar sus datos esas tablas son creadas en base a una sentencia SQL que
nosotros ejecutamos inclusive como van a ver en este ejercicio uniendo tablas con condiciones y parámetros
y demás.
Y una vez que tenemos nuestra instrucción Céret con el resultado eso lo vamos a grabar en un cursor
el sentido de esto es poder ir recorriendo el registro por registro capturando valores del cursor y
en base a eso vamos a poder hacer operaciones comparaciones y vamos a poder hacer procesos especiales
es muy difícil encontrar un ejemplo que nos permita defender el tema de los cursores porque todos hasta
ahora todo lo que hemos visto lo podemos hacer simplemente con una sentencia SQL pero es importante
que ustedes aprendan el tema de los cursores porque es algo muy usado en el mundo profesional con el
tema de las rutinas almacenadas y y esto es algo que les va a dar mucho más libertad para el manejo
de los datos.
Qué es lo que vamos a hacer aquí.
Nosotros vamos a recorrer nuestro cursor y vamos a sumar la ganancia que tuvimos vendiendo productos
en nuestra tabla ventas detalle.
Recuerden que en ventas detalle yo tengo los items de nuestra factura de nuestros productos vendidos
que tengo un campo precio que tengo un campo costo y que luego tengo un campo cantidad que me va a permitir
con estos tres valores saber cuál es la ganancia que tuve la ganancia es la resta del precio de venta
con el costo esa es la utilidad que he tenido de cada unidad.
Luego lo tendré que multiplicar por la cantidad para saber la ganancia real de ese item de esa factura
y todo eso lo vamos a ir acumulando en una variable que se llama ganancias donde vamos a poder dar un
número final al finalizar la rutina almacenada.
Vamos a poder devolver una rutina de un valor final.
Cuáles son las características de esta rutina almacenada.
Qué hemos hecho aquí.
Por empezar es una función.
Aquí ya estamos usando una función que va a devolver un valor decimal de diez coma dos.
Recuerden que cuando usábamos funciones y cursores específicamente yo les dije que tenían que elegir
esta opción si yo elijo la primera y lo quiero grabar me va a dar un error porque no es tan exacto no
es que solamente dentro de mi rutina voy a encontrar sentencias SQL sino que voy a tener que usar lectura
de datos y también sentencia SQL eso es lo que nos dice este acceso a datos.
Luego tenemos parámetros sin ningún tipo de sorpresa en esto pero vamos a saber cómo funciona y como
hemos declarado todo en primer lugar tenemos una variable llamada ganancia tenemos tres variables más
precio cantidad y costo que por qué no les puse precio y por qué usé el bajo si no son parámetros bueno
en este caso lo usé.
Por qué.
Para hacer de alguna forma una convención para no repetir nombre.
Si bien aquí el nombre real es Bede guión bajo y para darle alguna similitud a el nombre del campo.
Por eso le puse el guion bajo.
Esto es indistinto a ustedes se lo pueden quitar pueden colocar el nombre que ustedes quieran aquí y
yo luego le he puesto los tipos de datos medio.
Fíjense que no tiene longitud.
Ya el motor sabe cuanto aloja un video NiMH y luego tenemos un una variable que la uso como manejador
van a ver ahora cuando veamos nuestro manejador de error que es una variable llamada final que la voy
a definir con un valor de follen cero esto es lo mismo que colocar un set final igual cero pero quise
hacerlo de esta manera para que vean las distintas variantes.
Luego inmediatamente nuestras variables yo declaro Fíjense que aquí no coloco ningún set yo ya no empiezo
a trabajar con ellas tengo que hacer primero todas las declaraciones.
Luego aquí hago la declaración del cursor que se usa el mismo declare el nombre del cursor yo le he
puesto una soy un ave corta que es cursor de ventas la palabra reservada cursor la palabra reservada
for o sea va a ser un cursor.
De qué iba a ser un cursor de este resultado y ahí inmediatamente fíjense que el punto y coma está recién
al finalizar la sentencia SELECT.
Todo esto es un solo bloque que lo puse así para que lo puedan ver pero podría estar todo en una línea
completamente larga y que no iba a ser incómoda de ver pero lo coloqué así porque en definitiva al motor
lo que le interesa es encontrar el punto y coma cuando encontró el punto y coma sabe que ahí terminó
todo lo puedo le puedo dejar espacios inclusive no hay problema.
Entonces qué es lo que va a hacer esta sentencia sé que me va a traer estos tres campos de mi tabla
ventas detalle en mitad de la venta detalles y además cómo me va a permitir obtener la ganancia por
año y por mes.
Yo voy a tener que soy in-ear mitad habla tabla ventas detalles a la tabla ventas.
Aquí hemos puesto hasta aquí no hay misterio porque esto lo han visto como un ir tablas uniendo mis
dos campos clave.
Luego tengo mi mi cláusula Wear donde solamente voy a traer los artículos los items vendidos que tengan
costos y no me va a dar una ganancia mentirosa.
Hay muchos registros en la tabla en la tabla ventas detalles que van a ver si ustedes lo tienen al alcance
de sus manos el se huele y lo van a poder corroborar.
Que tienen el costo en cero.
Esos registros yo no los voy a tomar en cuenta porque cuando reste el precio de venta a ese costo me
va a dar como que la ganancia fue el precio de venta y es mentiroso.
Luego lo que tengo es el weak que solamente me traiga la factura que el año coincida con el parámetro
año que yo se lo voy a pasar por parametro y lo mismo con el mes que el mes de venta fechas se igual
al parámetro del mes.
Esto lo va a ejecutar si yo aquí no tuviera el cursor.
Si esta sentencia estas cuatro palabras no existieran lo que haces me muestra esto por pantalla me tira
esto por pantalla pero lo que va a hacer aquí es grabar todo esto en un cursor en una tabla en memoria.
Luego lo que tenemos es un manejador de fin de archivo aquí se maneja de esta manera para not found
o sea cuando quiero moverme en un registro quiero avanzar en el cursor y descubrió el fin de archivo
me va a entrar por not found y lo que hace en lugar de mostrarme un mensaje como en los ejercicios anteriores
le va a grabar le va a sestear fíjense que hay un set le va a sestear un 1 a la variable final que por
default viene en cero si tiene 1 1 significa que terminó ya está no tiene que seguir leyendo.
Vamos a aceptar nuestra ganancia que es el valor que nos interesa y que vamos a retornar va sestear
nuestra ganancia en cero.
Inmediatamente lo que hace es abrir el cursor yo no puedo trabajar con el cursor si no lo abro porque
ya lo creó ya grabó los datos pero ahora le tengo que decir bueno ahora abrirlo que lo voy a recorrer
y cuando terminé de recorrerlo es fundamental cerrarlo.
Si yo veo alguna de estas instrucciones el motor me va a dar error muy bien en el medio.
Entre que lo abro y lo cierro.
Voy a procesarlo.
Y cómo lo processo voy a ejecutar.
Voy a hacer un dúo.
Esta es una estructura de bucle de repetición hasta que se cumple una condición y la condición cual
es.
Yo voy a ejecutar mientras afinarse a cero recuerden que cuando encuentra fin de archivo el final del
cursor le va a mover un 1.
Voy a ejecutar esto mientras sea cero y voy a usar la instrucción fets.
La instrucción Fetch es la instrucción que me lee el próximo registro del curso cuando yo abro el cursor
el cursor.
Cuando el Open el cursor se posiciona en ningún registro yo no puedo abrir y después querer manipular
los datos del cursor.
No tengo que usar una instrucción fetch y es la que me va a posicionar en el próximo registro del curso
y qué es lo que hace Fetch el nombre del cursor y lo que lea lo tiene que grabar en las variables.
Si el cursor de acuerdo a la sentencia se cuele trae sólo tres campos.
Cuando yo lea el registro lo tengo que grabar en tres variables diferentes.
Si mi cursor solamente si mi instrucción se lee solamente trajera un valor voy a usar una variable.
Aquí tiene que haber concordancia y tengo que crear una variable por cada campo que traigo en la instrucción
Cele precio cantidad y costo precio cantidad y costo precio cantidad y costo.
Entonces leí el registro y le dije grava los valores grava los valores en las variables y es importante
esto no puedo cambiar el orden porque el motor no sabe que el primer valor es un precio el primero valor
lo va a grabar en la variable precio lo que yo le diga acá si el caso coloco costo no va a ir a buscarme
la columna costo no va a gravar el primer valor encontrado la primer columna y me la va a gravar en
costo y me va a dar un error error no me va a dar error me va a dar una información inconsistente mal
va a estar mal.
Esto lo tengo que respetar el mismo orden de los campos que usé en la sentencia SELECT para crear el
cursor tiene que ser el mismo orden de salida de los registros del cursor.
Tengo que gravar las variables en el mismo orden.
Muy bien ahora esta instrucción es una operación de imputado pues es una operación de lectura del cursor
puede haber arrojado un error qué error el de ya no hay más registros no me pediste que lea el próximo
y no hay más.
Eso va a disparar el Handler y le va a sestear uno a la variable final entonces yo inmediatamente después
de haber hecho la lectura del cursor lo que tengo que hacer es preguntar por la variable final porque
si no no puedo hacer operaciones matemáticas en un registro que me trajo nulo me va a dar error voy
a estar haciendo mal las cosas.
Entonces inmediatamente después de mi operación de cursor tengo que preguntar por el estado de esa operación
arrojó cero o arrojó uno.
En realidad no va a arrojar cero cero ya es el valor que trae la variable por default solamente va a
cambiar el valor si detecta un error.
Entonces el valor de la variable es cero significa que no encontró un fin de archivo y voy a poder procesar
esas variables.
Qué es lo que voy a hacer.
Voy a aceptar mi variable ganancia y le voy a decir que ganancia es igual a lo que ya tiene acumulado
ganancia más y en doble paréntesis voy a tener que restar el precio al costo eso me va a dar la utilidad
y el resultado lo voy a multiplicar por la cantidad.
Por eso hay un doble paréntesis primero ejecutar esto me va a dar una utilidad y al resultado.
En otro orden de paréntesis lo va a multiplicar por la cantidad y me va a dar la ganancia de ese ítem
de ese renglón de mi base de datos.
Entonces todo esto lo va a alojar y lo va a acumular en una variable ganancias.
Esto va a iterar hasta que al final sea igual a uno cuando cuando llega aquí vuelve arriba dice final
es igual a cero no es igual a uno entonces va a caer a la siguiente instrucción luego del enjuague se
entiende esto.
Esta es una estructura ya muy óptima de cómo manejarnos con los cursores Leo hasta que encuentro un
final y cómo encuentro un final y manejando errores la única manera.
No hay un no hay una instrucción no hay un cebé punto.
En fin como ocurren en otros lenguajes entonces esto es manejo de cursor o inmediatamente cuando ya
terminamos cerramos el cursor y retornamos el valor de ganancia al ser función la tenemos que retornar.
Es un retorno del valor que vengo acumulando de ganancia muy bien esta es aquí hemos tenido de todo
cursores variables hemos tenido estructuras de Lop de decisión hemos tenido comandos nuevos para el
manejo de cursor y hemos tenido una rutina almacenada de tipo función que vamos a ver ahora cómo funciona
valga la redundancia.
Bueno si voy a mi solapa de consultas yo no puedo colocar aquí van a ver que no se puede no puedo colocar
aquí ganancia ventas
y pasarle el sello 2018 año mes 5 de parametro me va a dar un error porque no me va a decir que el procedimiento
no existe porque realmente no existe pero si existe como una función y las funciones tienen un tratamiento
diferente.
Las funciones sólo pueden ser usadas desde una sentencia.
Entonces yo aquí voy a tener que reemplazar el alcohol por un Cele ejecutamos y me dice que la ganancia
total del año 2018 de mayo ha sido 228 1009 71 Bown 78.
Y si yo vuelvo a ejecutar esto pero le pongo junio me da 258 583 komas 73 fíjense lo rápido que lo ha
hecho es impresionante equipo colocó enero a ver si me da un número bastante diferente y me da 773 77
con 62 y esto yo puedo meterlo ya que tengo una instrucción sé le puedo decir que esto se llame ganancia
y además que me traiga y además que me traiga ventas fecha fueron ventas
me va a dar cualquier cosa estoy haciendo cualquier cosa lo que yo quiero mostrarles a ustedes y va
a demorar muchísimo por lo que veo lo que yo quiero mostrarles a ustedes es que ustedes pueden mezclar
funciones con Campos y uniones de tablas y condiciones Goear y demás.
Por qué está tardando ahora.
Por qué por cada factura que encuentra por cada factura que encuentra mi tabla ventas está ejecutando
esto se entiende a.
Esto no lo van a hacer esto las funciones la van a usar y no para precisamente mezclar con sentencias.
Cuando en mi función lo que hago es obtener un total que es el recorrido de una de una tabla esto no
se puede estar minutos y minutos corriendo así que lo vamos a detener.
Esto es lo mismo que en meter aquí un Shum por ejemplo es lo mismo ustedes van a poder usar esto como
una función suya de mi círculo y lo van a enriquecer el lenguaje ustedes van a poder crear sus propias
funciones no les alcanza con las que ya trae el motor.
Van a crear sus propias funciones porque ustedes tienen un tratamiento diferente de lo que tienen que
ser el procesamiento de los datos y de las tablas y les va a permitir crear funciones.
Esta es la última clase y esta es la explicación final de lo que son los estor presidios.
Por supuesto existe mucho más existen muchas más cosas.
No vamos a andar más en este curso acerca de esto al menos no por ahora por una cuestión de tiempo creo
que con esto han tenido un pantallazo bastante amplio y claro de qué es lo que pueden hacer y cómo hacerlo
y ustedes ahora empezarán a jugar con esta posibilidad porque ustedes ya saben el lenguaje SQL ya conocen
Jaydy SQL ya saben sobre Maisí Colsa saben cómo crear tablas crear campos índices y bueno ahora les
toca elesfuerzo a ustedes.
Espero que les haya gustado esta nueva sección lo que vamos a ver en la próxima sección los he dividido
por secciones y capítulos es todo sobre triggers los disparadores vamos a ver que son como usarlos para
qué nos sirven y también han sido pedido por ustedes así que los he incluido en éste.
En este bonus track que tiene este añadido que ha tenido el curso y bueno estoy muy a gusto con los
comentarios espero que puedan votar y poner buenas reseñas que es lo que le ayuda al curso y bueno ha
sido un placer.
Hasta aquí seguimos en la próxima sección.