Cristhian Sebastian Sosa
/*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;