Cristhian Sebastian Sosa

Linkedin

/*1. Para cada mascota, se necesita listar sus citas con fin de vacunación,
y la familia a la que pertenece. Solo se debe tomar de gatos y perros nacidos en 
2019, antes de la pandemia.*/
SELECT C.fecha_cita, R.id_familia 
FROM cl_cita C 
JOIN cl_registro_medico R ON C.id_reg_medico = R.id_reg_medico 
JOIN 
cl_mascota M ON R.id_mascota = M.id_mascota 
WHERE C.vacuna = 'S' AND 
EXTRACT(YEAR FROM M.fecha_nacimiento) = 2019
AND M.especie = 'DOG' OR M.especie = 'CAT';

SELECT * FROM CL_MASCOTA
/* Al solicitar una lista se realiza una consulta de los datos que solicito, paso seguido un join con las demas tablas*/
/*2. La veterinaria creció y ahora tiene sucursales en diferentes partes del país.
Teniendo en cuenta esto, debemos integrar los datos de las sucursales a nuestro 
actual esquema, y así obtener la información de dónde fue tratado el animal. 
Te toca integrar esta tabla que viene con: Un identificador numérico de la sucursal,
una descripción con el nombre de la sucursal con un largo no mayor a 50, el registro
médico de la mascota y las citas que fueron tratadas ahí. Con esa introducción, 
¿cómo afrontas este requerimiento? Guardar script para el futuro pasaje a producción
y justificación a la integración. Como área de desarrollo debemos introducir algunos
datos de pruebas a esta tabla.*/
CREATE TABLE CL_SUCURSAL(  ---Creamos una nueva tabla denominada sucursal
id_sucursal NUMBER(*,0),
nombre VARCHAR2(50),
CONSTRAINT pk_sucursal PRIMARY KEY(id_sucursal)
);

DECLARE  ---Lleno la tabla sucursal
v_id_sucursal cl_sucursal.id_sucursal%TYPE := 1;
BEGIN
    LOOP
    INSERT INTO cl_sucursal VALUES(v_id_sucursal, 'Sucursal_'||v_id_sucursal);
    v_id_sucursal := v_id_sucursal + 1;
    EXIT WHEN v_id_sucursal > 5;
    END LOOP;
END;

ALTER TABLE cl_cita ADD id_sucursal NUMBER(*,0); ---Añadimos la columna sucursal a la tabla cl_cita y le ponemos la fk

ALTER TABLE cl_cita ADD CONSTRAINT fk_sucursal FOREIGN KEY(id_sucursal) REFERENCES cl_sucursal(id_sucursal); ---Generamos la fk

DECLARE  ---Lleno la columna id_sucursal
V_ID_SUCURSAL CL_SUCURSAL.ID_SUCURSAL%TYPE;
CONTADOR NUMBER := 1;
BEGIN
    FOR I IN 1..30 LOOP
    V_ID_SUCURSAL := DBMS_RANDOM.VALUE(1,5);
    UPDATE CL_CITA SET ID_SUCURSAL = V_ID_SUCURSAL WHERE ID_REG_MEDICO = CONTADOR;
    CONTADOR :=  CONTADOR + 1;
    END LOOP;
END;

/*Se crea una columna con ID de sucursal en CL_CITA y su respectiva FK*/
/*3. Tendrán una tabla de errores que guardará el registro de los mismos para cada uno
de los procesos que existen dentro de la veterinaria. El registro debe tener como mínimo
las columnas de: Identificador del Error, descripción, fecha y hora que se produjo, 
el nombre del proceso. Dejo a su imaginación el agregado de columnas extras.*/

CREATE TABLE MISTAKE ( --Creamos la tabla para errores
  FECHA       TIMESTAMP,               
  USUARIO      VARCHAR2(30),
  MENSAJE       VARCHAR2(512),
  SENTENCIA      VARCHAR2(512)
);

CREATE OR REPLACE TRIGGER ERRORES -- Capturas los errores 
   AFTER SERVERERROR ON DATABASE
DECLARE
   SQL_TEXT ORA_NAME_LIST_T;
   T_MENSAJE    VARCHAR2(2000) := NULL;
   T_SENTENCIA    VARCHAR2(2000) := NULL;
BEGIN
  FOR DEPTH IN 1 .. ORA_SERVER_ERROR_DEPTH LOOP
    T_MENSAJE := T_MENSAJE || ORA_SERVER_ERROR_MSG(DEPTH);
  END LOOP;
  
  FOR I IN 1 .. ORA_SQL_TXT(SQL_TEXT) LOOP
     T_SENTENCIA := T_SENTENCIA || SQL_TEXT(I);
  END LOOP;
  
  INSERT INTO MISTAKE(FECHA, USUARIO, MENSAJE, SENTENCIA) -- y los inserta en la tabla Mistake
  VALUES (SYSDATE, ORA_LOGIN_USER, T_MENSAJE, T_SENTENCIA);
END;

UPDATE CL_PERSONA --Se intenta violar la fk
SET ID_PERSONA = 20
WHERE ID_PERSONA = 1;

SELECT * FROM MISTAKE; -- Se consulta

    /* Creamos la tabla para alojar  los errores , paso siguiente se crea un procedimiento para que inserte 
    en ella cada error que se produce y afecte directamente los datos de la BD*/
/*4. Se tienen datos dentro de nuestra base de datos, pero la dueña de la veterinaria 
quiere poder actualizar los sistemas. De nuestra parte, se le creará un proceso que 
tome como parámetro las columnas para la carga de cada tabla. Se debe devolver al 
programa si fue exitoso o no la carga.*/

--Creamos un proceso por tabla menos Familia

CREATE OR REPLACE PROCEDURE update_persona 
(
p_id_persona cl_persona.id_persona%TYPE,
p_desc_persona cl_persona.desc_persona%TYPE,
p_relacion_mascota cl_persona.relacion_mascota%TYPE)
AS
BEGIN
    UPDATE cl_persona SET id_persona=p_id_persona,
                          desc_persona=p_desc_persona,
                          relacion_mascota=p_relacion_mascota
                          WHERE id_persona=p_id_persona;
 IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;

CREATE OR REPLACE PROCEDURE update_rel_familia_persona 
(
p_id_familia cl_rel_familia_persona.id_familia%TYPE,
p_id_persona cl_rel_familia_persona.id_persona%TYPE)
AS
BEGIN
    UPDATE cl_rel_familia_persona SET id_familia=p_id_familia,
                                      id_persona=p_id_persona
                                      WHERE id_familia=p_id_familia;
IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;

CREATE OR REPLACE PROCEDURE update_especie
(
p_id_especie cl_especie.id_especie%TYPE,
p_desc_especie cl_especie.desc_especie%TYPE)
AS
BEGIN
    UPDATE cl_especie SET id_especie=p_id_especie,
                          desc_especie=p_desc_especie
                          WHERE id_especie=p_id_especie;
IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;

CREATE OR REPLACE PROCEDURE update_mascota
(
p_id_mascota cl_mascota.id_mascota%TYPE,
p_desc_mascota cl_mascota.desc_mascota%TYPE,
p_id_familia cl_mascota.id_familia%TYPE,
p_especie cl_mascota.especie%TYPE,
p_raza cl_mascota.raza%TYPE,
p_fecha_nacimiento cl_mascota.fecha_nacimiento%TYPE)
AS
BEGIN
    UPDATE cl_mascota SET id_mascota=p_id_mascota,
                          desc_mascota=p_desc_mascota,
                          id_familia=p_id_familia,
                          especie=p_especie,
                          raza=p_raza,
                          fecha_nacimiento=p_fecha_nacimiento
                          WHERE id_mascota=p_id_mascota;
IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;

CREATE OR REPLACE PROCEDURE update_registro_medico
(
p_id_reg_medico cl_registro_medico.id_reg_medico%TYPE,
p_id_mascota cl_registro_medico.id_mascota%TYPE,
p_id_familia cl_registro_medico.id_familia%TYPE,
p_fecha_creacion cl_registro_medico.fecha_creacion%TYPE)
AS
BEGIN
    UPDATE cl_registro_medico SET id_reg_medico=p_id_reg_medico,
                                  id_mascota=p_id_mascota,
                                  id_familia=p_id_familia,
                                  fecha_creacion=p_fecha_creacion
                                  WHERE id_reg_medico=p_id_reg_medico;
IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;

CREATE OR REPLACE PROCEDURE update_cita
(
p_id_reg_medico cl_cita.id_reg_medico%TYPE,
p_nro_cita cl_cita.nro_cita%TYPE,
p_desc_cita cl_cita.desc_cita%TYPE,
p_comentario_cita cl_cita.comentario_cita%TYPE,
p_vacuna cl_cita.vacuna%TYPE,
p_fecha_cita cl_cita.fecha_cita%TYPE)
AS
BEGIN
    UPDATE cl_cita SET id_reg_medico=p_id_reg_medico,
                       nro_cita=p_nro_cita,
                       desc_cita=p_desc_cita,
                       comentario_cita=p_comentario_cita,
                       vacuna=p_vacuna,
                       fecha_cita=p_fecha_cita
                       WHERE id_reg_medico=p_id_reg_medico;
IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;
/*5. Crear un proceso que le permita a los usuarios actualizar las familias. También 
indicar si fue exitoso o no y la cantidad de filas afectadas en la actualización.*/

SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE update_familia -- Realizamos el mismo proceso que en el punto anterior.
(
p_id_familia cl_familia.id_familia%TYPE,
p_desc_familia cl_familia.desc_familia%TYPE,
p_telefono cl_familia.telefono%TYPE,
p_pais cl_familia.pais%TYPE,
p_provincia cl_familia.provincia%TYPE,
p_ciudad cl_familia.ciudad%TYPE,
p_barrio cl_familia.barrio%TYPE,
p_direccion cl_familia.direccion%TYPE)
AS
BEGIN
    UPDATE cl_familia SET id_familia=p_id_familia,
                          desc_familia=p_desc_familia,
                          telefono=p_telefono,
                          pais=p_pais,
                          provincia=p_provincia,
                          ciudad=p_ciudad,
                          barrio=p_barrio,
                          direccion=p_direccion
                          WHERE id_familia = p_id_familia;
    IF SQL%found THEN
    dbms_output.put_line('Successful update, updated records: '||SQL%rowcount);
    ELSE dbms_output.put_line('Wrong update');
    END IF;
END;
/*6. Nos dijeron que tenemos un problema en la actualización de datos de las familias,
ya que el programa indica colocar el legajo de la familia y no todas se acuerdan el
mismo. Crear algún procedimiento o función que devuelva las mascotas de la familia y 
así asegurar las inquietudes. Mostrar por pantalla. (DBMS_OUTPUT.PUT_LINE en nuestro caso)*/

CREATE OR REPLACE PROCEDURE MASCOTASPORFAMILIA
AS
CURSOR CURSORESFAMILIA IS SELECT ID_FAMILIA FROM CL_MASCOTA;
PID_FAMILIA CL_MASCOTA.ID_FAMILIA%TYPE;
CURSOR CURSORESMASCOTA IS SELECT ID_MASCOTA FROM CL_MASCOTA;
PID_MASCOTA CL_MASCOTA.ID_MASCOTA%TYPE;
MASCOTA NUMBER := 21;
BEGIN
OPEN CURSORESFAMILIA;
OPEN CURSORESMASCOTA;
    LOOP
    FETCH CURSORESFAMILIA INTO PID_FAMILIA;
    FETCH CURSORESMASCOTA INTO PID_MASCOTA;
    IF PID_FAMILIA <= 10 THEN
    DBMS_OUTPUT.PUT_LINE('La familia '||PID_FAMILIA ||' Dueño mascotas '||PID_MASCOTA||' y '||MASCOTA);
    ELSE  DBMS_OUTPUT.PUT_LINE('La familia '||PID_FAMILIA ||' Dueño mascota '||PID_MASCOTA);
    END IF;
    MASCOTA := MASCOTA + 1;
    EXIT WHEN PID_FAMILIA = 20;
    END LOOP;
    CLOSE CURSORESFAMILIA;
    CLOSE CURSORESMASCOTA;
END;
*7. Hubo una auditoría y no se pasó porque se requería tener las citas no concretadas.
Vuelven la semana que viene para una segunda oportunidad. Como analistas desarrolladores,
¿qué solución implementarían? Cualquiera sea la solución, desde el área debemos dar resultados,
por lo que se requiere verlos implementados dentro del modelo.*/

SELECT * FROM cl_cita;
---Agrego columna cita_concretada

ALTER TABLE cl_cita ADD cita_concretada CHAR(2);  --Agregamos la clumna cita_concretada

DECLARE
v_vacuna cl_cita.vacuna%TYPE;
BEGIN
    FOR I IN 1..30 LOOP
    UPDATE cl_cita SET cita_concretada = 'Si' WHERE vacuna = 'S';
    UPDATE cl_cita SET cita_concretada = 'No' WHERE vacuna = 'N';
    END LOOP;
END;

CREATE OR REPLACE PROCEDURE citaconcretada (p_fecha_cita 
IN cl_cita.fecha_cita%TYPE, --Creamos un procedure para que el usuario coloque la fecha y sepa si la cita fue concretada o no
p_cita_concretada OUT cl_cita.cita_concretada%TYPE)
IS
CURSOR cursorcita (p_cita cl_cita.fecha_cita%TYPE)
IS
SELECT cita_concretada FROM cl_cita 
WHERE fecha_cita =  p_cita;
BEGIN
OPEN cursorcita(p_fecha_cita);
FETCH cursorcita INTO p_cita_concretada;
CLOSE cursorcita;
IF p_cita_concretada = 'Si' THEN dbms_output.put_line('Concretada');
ELSIF p_cita_concretada = 'No' THEN dbms_output.put_line('No fue concretada');
ELSE dbms_output.put_line('No hay cita');
END IF;
END;

SET SERVEROUTPUT ON;

DECLARE
v_cita cl_cita.cita_concretada%TYPE;
BEGIN
citaconcretada('21/11/20', v_cita);
END;

   /*Se agrega una nueva columna con valores (si/no) que confirma o no si fue concretada la cita*/
/*8. Ya implementada la solución anterior, nos piden ver por cada persona su frecuencia en citas
realizadas y concretadas, obteniendo un porcentaje de fiabilidad. Mostrar por pantalla.*/

SET SERVEROUTPUT ON;

CREATE OR REPLACE PROCEDURE FIABILIDADCLIENTES
AS
CURSOR CURSORFAMILIAS2 IS SELECT ID_FAMILIA FROM CL_REGISTRO_MEDICO;
P_ID_FAMILIA CL_REGISTRO_MEDICO.ID_FAMILIA%TYPE;
CURSOR CURSORCITAS2 IS SELECT CITA_CONCRETADA FROM CL_CITA;
P_CITA_CONCRETADA CL_CITA.CITA_CONCRETADA%TYPE;
BEGIN
    OPEN CURSORFAMILIAS2;
    OPEN CURSORCITAS2;
    LOOP
    FETCH CURSORFAMILIAS2 INTO P_ID_FAMILIA;
    FETCH CURSORCITAS2 INTO P_CITA_CONCRETADA;
    IF P_CITA_CONCRETADA = 'Si' THEN
    DBMS_OUTPUT.PUT_LINE('La familia '|| P_ID_FAMILIA || ' tiene un porcentaje de fiabilidad del 100%');
    ELSE DBMS_OUTPUT.PUT_LINE('La familia '|| P_ID_FAMILIA||' tiene un porcentaje de fiabilidad del 0%');
    END IF;
    EXIT WHEN P_ID_FAMILIA = 20;
    END LOOP;
    CLOSE CURSORFAMILIAS2;
    CLOSE CURSORCITAS2;
END;

EXEC FIABILIDADCLIENTES;
/*9. El sistema está creciendo, la veterinaria tiene una sección de ventas, pero de la que se encarga otro equipo.
De nuestro lado, debemos crear una forma de separar nuestros procesos de los procesos de ventas.
¿Qué solución le vamos a dar?*/

---CREACION DE PAQUETES

CREATE OR REPLACE PACKAGE PAQUETE_ACTUALIZACION IS
PROCEDURE ACTUALIZACION_ESPECIE(
P_ID_ESPECIE CL_ESPECIE.ID_ESPECIE%TYPE,
P_DESC_ESPECIE CL_ESPECIE.DESC_ESPECIE%TYPE);
PROCEDURE ACTUALIZACION_PERSONA(P_ID_PERSONA CL_PERSONA.ID_PERSONA%TYPE,
P_DESC_PERSONA CL_PERSONA.DESC_PERSONA%TYPE,
P_RELACION_MASCOTA CL_PERSONA.RELACION_MASCOTA%TYPE);
END;

CREATE OR REPLACE PACKAGE BODY PAQUETE_ACTUALIZACION IS
PROCEDURE ACTUALIZACION_ESPECIE(
P_ID_ESPECIE CL_ESPECIE.ID_ESPECIE%TYPE,
P_DESC_ESPECIE CL_ESPECIE.DESC_ESPECIE%TYPE)
AS
BEGIN
    UPDATE CL_ESPECIE SET ID_ESPECIE=P_ID_ESPECIE,
                          DESC_ESPECIE=P_DESC_ESPECIE
                          WHERE ID_ESPECIE=P_ID_ESPECIE;
IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Actualizacion correcta, registros actualizados: '||SQL%ROWCOUNT);
    ELSE DBMS_OUTPUT.PUT_LINE('Actualizacion incorrecta');
    END IF;
END;
PROCEDURE ACTUALIZACION_PERSONA (
P_ID_PERSONA CL_PERSONA.ID_PERSONA%TYPE,
P_DESC_PERSONA CL_PERSONA.DESC_PERSONA%TYPE,
P_RELACION_MASCOTA CL_PERSONA.RELACION_MASCOTA%TYPE)
AS
BEGIN
    UPDATE CL_PERSONA SET ID_PERSONA=P_ID_PERSONA,
                          DESC_PERSONA=P_DESC_PERSONA,
                          RELACION_MASCOTA=P_RELACION_MASCOTA
                          WHERE ID_PERSONA=P_ID_PERSONA;
 IF SQL%FOUND THEN
    DBMS_OUTPUT.PUT_LINE('Actualizacion correcta, registros actualizados: '||SQL%ROWCOUNT);
    ELSE DBMS_OUTPUT.PUT_LINE('Actualizacion incorrecta');
    END IF;
END;
END PAQUETE_ACTUALIZACION;

   /*Para separar nuestros procesos a los de ventas implementamos paquetes que almacenan todos los procedure
   para que pueda ser actualizados los registros en los paquetes.*/
/*10. Se debe crear un proceso que tome a todos los Caimanes y queden para la sucursal 1. Listar qué familias son las involucradas.*/

SELECT * FROM CL_MASCOTA;--Realizo un join para averiguar el id_reg_medico de las tarantulas y veo que del 6 en adelante son tarantulas
SELECT C.ID_SUCURSAL, R.ID_REG_MEDICO, M.ESPECIE FROM CL_CITA C JOIN CL_REGISTRO_MEDICO R ON C.ID_REG_MEDICO = R.ID_REG_MEDICO 
JOIN CL_MASCOTA M ON R.ID_MASCOTA = M.ID_MASCOTA WHERE ESPECIE = 'DOG';--updateo la tabla cita para que los perros pertenezcan a la sucursal 1
DECLARE
CONTADOR NUMBER := 6;
BEGIN
LOOP
UPDATE CL_CITA SET ID_SUCURSAL = 1 WHERE ID_REG_MEDICO = CONTADOR;
CONTADOR := CONTADOR + 1;
EXIT WHEN CONTADOR > 30; 
END LOOP;
END;

SELECT * FROM CL_CITA;
/*11*/

SELECT R.id_familia,COUNT (DISTINCT R.id_persona) "cantidad de personas", COUNT(DISTINCT M.id_mascota) "cantidad de mascotas"
FROM cl_rel_familia_persona R JOIN cl_mascota M ON R.id_familia = M.id_familia GROUP BY R.id_familia;

CREATE GLOBAL TEMPORARY TABLE personasfamiliamascota 
(
id_familia NUMBER(*,0),
id_persona NUMBER(*,0),
id_mascota NUMBER(*,0)
)
ON COMMIT PRESERVE ROWS

INSERT INTO personasfamiliamascota(id_familia, id_persona, id_mascota) SELECT R.id_familia,COUNT (DISTINCT R.id_persona) "cantidad de personas", COUNT(DISTINCT M.id_mascota) "cantidad de mascotas"
FROM cl_rel_familia_persona R JOIN cl_mascota M ON R.id_familia = M.id_familia GROUP BY R.id_familia;

SELECT * FROM personasfamiliamascota;

CREATE OR REPLACE PROCEDURE personasmascotasporfamilia
IS
CURSOR cursorfamilia IS SELECT id_familia FROM personasfamiliamascota;
p_id_familia cl_familia.id_familia%TYPE;
CURSOR cursorpersona IS SELECT id_persona FROM personasfamiliamascota;
p_id_persona cl_persona.id_persona%TYPE;
CURSOR cursormascota IS SELECT id_mascota FROM personasfamiliamascota;
p_id_mascota cl_mascota.id_mascota%TYPE;
BEGIN
    OPEN cursorfamilia;
    OPEN cursorpersona;
    OPEN cursormascota;
    LOOP 
    FETCH cursorfamilia INTO p_id_familia;
    FETCH cursorpersona INTO p_id_persona;
    FETCH cursormascota INTO p_id_mascota;
    EXIT WHEN p_id_familia = 20;
    IF p_id_familia = 1 THEN
    dbms_output.put_line('La familia '||p_id_familia||' posee ' ||p_id_persona||' persona '||'y '||p_id_mascota ||' mascotas');
    ELSIF p_id_familia > 1 AND p_id_mascota = 1 THEN
    dbms_output.put_line('La familia '||p_id_familia||' posee ' ||p_id_persona||' personas '||'y '||p_id_mascota ||' mascota');
    ELSE
    dbms_output.put_line('La familia '||p_id_familia||' posee ' ||p_id_persona||' personas '||'y '||p_id_mascota ||' mascotas');
    END IF;
    END LOOP;
    CLOSE cursorfamilia;
    CLOSE cursorpersona;
    CLOSE cursormascota;
END;

SET SERVEROUTPUT ON;
EXEC personasmascotasporfamilia;

 /*Solo tengo perros y gatos por lo que actualice esos registros y se los asigne a la sucursal 1*/
/*12. Usando el método anterior, se quiere implementar un descuento a los participantes de esa familia. Se tomará:
a. si supera las 2 mascotas y tiene menos de 3 personas en la familia para darle un descuento de un 15%
b. si supera las 5 mascotas y tiene menos de 4 personas se aplica un descuento de un 40%
c. si tiene una mascota, aplicar descuento de del 10%.*/

CREATE OR REPLACE PROCEDURE descuentos
IS
CURSOR cursorfamilia IS SELECT id_familia FROM personasfamiliamascota;
p_id_familia cl_familia.id_familia%TYPE;
CURSOR cursorpersona IS SELECT id_persona FROM personasfamiliamascota;
p_id_persona cl_persona.id_persona%TYPE;
CURSOR cursormascota IS SELECT id_mascota FROM personasfamiliamascota;
p_id_mascota cl_mascota.id_mascota%TYPE;
BEGIN
    OPEN cursorfamilia;
    OPEN cursorpersona;
    OPEN cursormascota;
    LOOP 
    FETCH cursorfamilia INTO p_id_familia;
    FETCH cursorpersona INTO p_id_persona;
    FETCH cursormascota INTO p_id_mascota;
    EXIT WHEN p_id_familia = 20;
    IF p_id_mascota = 1 THEN
    dbms_output.put_line('La familia '||p_id_familia||' posee un 10% de descuento');
    ELSIF p_id_mascota > 2 AND p_id_persona < 3 THEN
    dbms_output.put_line('La familia '||p_id_familia||' posee un 15% de descuento');
    ELSIF p_id_mascota > 5 AND p_id_persona < 4 THEN
    dbms_output.put_line('La familia '||p_id_familia||' posee un 40% de descuento');
    ELSE
    dbms_output.put_line('La familia '||p_id_familia||' no posee descuento');
    END IF;
    END LOOP;
    CLOSE cursorfamilia;
    CLOSE cursorpersona;
    CLOSE cursormascota;
END;

EXEC descuentos;
/*13. Sabiendo la familia, cada mes se hará un regalo especial por parte de la veterinaria de salsa de comidas para gatos. 
Hacer un proceso que nos dé como resultado final la cantidad de salsitas a regalar por familia.*/

SELECT * FROM cl_registro_medico;

SELECT id_familia, SUM(round (months_between(sysdate, fecha_creacion))) FROM cl_registro_medico GROUP BY id_familia ORDER BY id_familia;

CREATE GLOBAL TEMPORARY TABLE cantidaddesalsitas 
(
id_familia NUMBER(*,0),
meses NUMBER(*,0)
)
ON COMMIT PRESERVE ROWS

INSERT INTO cantidaddesalsitas SELECT id_familia, SUM(round (months_between(sysdate, fecha_creacion))) FROM cl_registro_medico GROUP BY id_familia ORDER BY id_familia;

SELECT * FROM cantidaddesalsas;

CREATE OR REPLACE PROCEDURE salsas
IS
CURSOR cursorfamilia IS SELECT id_familia FROM cantidaddesalsitas;
p_id_familia cl_registro_medico.id_familia%TYPE;
CURSOR cursorfecha IS SELECT meses FROM cantidaddesalsitas;
p_meses NUMBER;
BEGIN
    OPEN cursorfamilia;
    OPEN cursorfecha;
    FOR I IN 1..20 LOOP
    FETCH cursorfamilia INTO p_id_familia;
    FETCH cursorfecha INTO p_meses;
    dbms_output.put_line('A la familia '||p_id_familia||' le corresponden '||p_meses||' salsitas ');
    END LOOP;
    CLOSE cursorfamilia;
    CLOSE cursorfecha;
END;

EXEC salsas;