Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3 Curso 2021
Bibliografía:
- Date, C.J., Introducción a los Sistemas de Bases de Datos, 5ta. Capítulos 4 y 17.
- SQL Server 2000. Book Online.
INTRODUCCIÓN
Para el manejo de grandes cantidades de datos tanto en PostgreSQL como en otras bases de
datos relacionales existe el concepto de cursores, los cuales representan un resultset (conjunto de
datos) que son asociados a una variable, una variable de tipo cursor. Esta variable representa un
apuntador hacia una tabla virtual representada por una consulta y su respectivo comando SELECT
asociado.
Declaración de Variables de Cursor
Ejemplo: DECLARE
Apertura de Cursores
Un cursor debe ser abierto para poder utilizarse.
1
Bases de Datos Avanzada Clase Práctica No. 3 Curso 2021
Existen cuatro formas de abrir un cursor.
OPEN FOR EXECUTE: La consulta se especifica como una expresion de texto, al igual que
se usa con el comando EXECUTE.
(ej. OPEN curs1 FOR EXECUTE ''SELECT * FROM '' || quote_ident($1);)
Uso de Cursores
Desarrollo:
2
Bases de Datos Avanzada Clase Práctica No. 3 Curso 2021
norma_producción (cod_norma, cod_suelo, cod_fertilizante, cod_cultivo, cod_variedad,
producción, tiempo_cumplimiento)
cumplimiento_norma (cod_obrero, cod_norma, porciento_cumplimiento, fecha_cumplimiento,
fecha_inicio)
2. Se conoce que los Fertilizantes provenientes de Brasil, Venezuela y Bolivia, han aumentado
su precio en un 10%, 5% y 15% respectivamente. Implemente una función que permita
actualizar las filas correspondientes.
CREATE OR REPLACE FUNCTION actualizarPrecioFertilizantes()
RETURNS void AS $BODY$
DECLARE
fertilizantes refcursor;
codFertilizante varchar;
preciofert double precision;
3
Bases de Datos Avanzada Clase Práctica No. 3 Curso 2021
nombrepais varchar;
precioTemp double precision;
BEGIN
OPEN fertilizantes FOR SELECT fertilizante.cod_fertilizante,
fertilizante.precio, pais.nom_pais
FROM fertilizante
INNER JOIN pais
ON fertilizante.cod_pais = pais.cod_pais
WHERE pais.nom_pais = 'Brasil' OR pais.nom_pais = 'Venezuela' OR
pais.nom_pais = 'Bolivia';
LOOP
FETCH fertilizantes INTO codFertilizante, preciofert, nombrepais;
EXIT WHEN NOT FOUND;
precioTemp =0;
IF(nombrepais='Brasil') THEN
precioTemp = preciofert + preciofert*0.1;
ELSIF(nombrepais='Venezuela') THEN
precioTemp = preciofert + preciofert*0.05;
ELSIF(nombrepais='Bolivia') THEN
precioTemp = preciofert + preciofert*0.15;
END IF;
4
Bases de Datos Avanzada Clase Práctica No. 3 Curso 2021
salTemp double precision;
BEGIN
OPEN obreoAgr FOR SELECT cod_obrero, salario, nom_categoria
FROM obrero_agricola
INNER JOIN categoria_ocupacional
ON obrero_agricola.cod_categoria = categoria_ocupacional.cod_categoria;
WHERE categoría_ocupacional.nom_categoria LIKE 'Tecnico'
OR categoría_ocupacional.nom_categoria LIKE 'Servicios'
LOOP
FETCH obreoAgr INTO codObrero, sal, categ;
EXIT WHEN NOT FOUND;
salTemp =0;
IF(categ = 'Tecnico') THEN
salTemp = sal;
Estudio Individual
Realice las siguientes funciones:
1. Devolver el tiempo de cumplimiento total (tiempo_cumplimiento) y la cantidad de normas de
una variedad de un cultivo.
2. Utilizando la función anterior, resuelva:
Si el tiempo de cumplimiento total es superior a 60 días y la cantidad de normas es mayor
que 3, entonces en cada norma de esa variedad de cultivo, el tiempo de cumplimiento se
debe actualizar. El nuevo tiempo de cumplimiento para cada norma será igual al que tenía
menos la diferencia del tiempo de cumplimiento total y 60 entre la cantidad de normas de
esa variedad.
Por ejemplo si para la variedad con código 01 del cultivo con código 02 el tiempo de
cumplimiento total registrado en las normas es de 65 y la cantidad de normas es 5,
entonces hay que actualizar cada tiempo de cumplimiento de esa variedad y el nuevo valor
será: tiempo_cumplimiento-((65-60)/5)
RESPUESTA 1:
5
Bases de Datos Avanzada Clase Práctica No. 3 Curso 2021
RESPUESTA 2:
CREATE FUNCTION actualizar_tiempo_cumplimiento()
RETURNS void AS
DECLARE
variedades refcursor;
tiempo_total integer;
cant_normas integer;
cod_cult character varying(2);
cod_varie character varying(2);
BEGIN
variedades = tiempo_cumplimiento_por_variedad_cultivo();
LOOP
FETCH variedades INTO
tiempo_total,cant_normas,cod_cult,cod_varie;
EXIT WHEN NOT FOUND;
IF (tiempo_total > 60) and (cant_normas > 3) THEN
update norma_produccion set tiempo_cumplimiento =
tiempo_cumplimiento - ((tiempo_total-60)/cant_normas)
where cod_cultivo = cod_cult and cod_variedad = cod_varie;
END IF;
END LOOP;
CLOSE variedades;
END
LANGUAGE plpgsql;