Está en la página 1de 5

SET SERVEROUTPUT ON;

--- GRABAR DATOS EN TABLA DETALLE_ATENMEDICAS_MENSUALES

CREATE OR REPLACE PROCEDURE poblar_detalle_atenmedicas_mensuales(p_mes NUMBER,


p_anno NUMBER) IS
v_min_ate_id NUMBER;
v_max_ate_id NUMBER;
v_ate_id NUMBER;
v_unidad_atencion VARCHAR2(50);
v_cargo_medico VARCHAR2(30);
v_descuento_tercera_edad NUMBER;
v_especialidad_medico VARCHAR2(25);
BEGIN
-- Obtener el rango de ate_id
SELECT MIN(ate_id), MAX(ate_id)
INTO v_min_ate_id, v_max_ate_id
FROM ATENCION
WHERE EXTRACT(MONTH FROM fecha_atencion) = p_mes
AND EXTRACT(YEAR FROM fecha_atencion) = p_anno;

-- Iterar sobre el rango de ate_id


FOR v_ate_id IN v_min_ate_id..v_max_ate_id
LOOP
-- Obtener datos de la atención médica
SELECT
reg_atencion.ate_id,
reg_atencion.fecha_atencion,
reg_atencion.hr_atencion,
reg_atencion.costo,
reg_atencion.nombre_paciente,
reg_atencion.sistema_salud,
reg_atencion.nombre_medico,
reg_atencion.especialidad_medico,
reg_atencion.cargo_medico,
reg_atencion.fecha_venc_pago,
reg_atencion.monto_a_cancelar,
obtener_unidad_atencion(reg_atencion.ate_id) AS unidad_atencion,
obtener_cargo_medico_func(ate.med_rut) AS cargo_medico,
obtener_descuento_tercera_edad(pac.pac_rut) AS descuento_tercera_edad,
obtener_especialidad_medico(med.med_rut) AS especialidad_medico
INTO
reg_atencion
FROM
(SELECT
ate.ate_id,
ate.fecha_atencion,
ate.hr_atencion,
ate.costo,
pac.pnombre || ' ' || pac.snombre || ' ' || pac.apaterno || ' ' ||
pac.amaterno AS nombre_paciente,
ts.descripcion AS sistema_salud,
m.pnombre || ' ' || m.snombre || ' ' || m.apaterno || ' ' || m.amaterno AS
nombre_medico,
obtener_especialidad_medico(m.med_rut) AS especialidad_medico,
obtener_cargo_medico_func(m.med_rut) AS cargo_medico,
pa.fecha_venc_pago,
pa.monto_a_cancelar
FROM
ATENCION ate
JOIN PACIENTE pac ON ate.pac_rut = pac.pac_rut
JOIN MEDICO m ON ate.med_rut = m.med_rut
JOIN SALUD s ON pac.sal_id = s.sal_id
JOIN TIPO_SALUD ts ON s.tipo_sal_id = ts.tipo_sal_id
LEFT JOIN PAGO_ATENCION pa ON ate.ate_id = pa.ate_id
WHERE
ate.ate_id = v_ate_id) reg_atencion;

-- Insertar datos en la tabla DETALLE_ATENMEDICAS_MENSUALES


INSERT INTO DETALLE_ATENMEDICAS_MENSUALES (
ate_id,
fecha_atencion,
hr_atencion,
costo,
nombre_paciente,
sistema_salud,
nombre_medico,
especialidad_medico,
cargo_medico,
fecha_venc_pago,
monto_a_cancelar,
unidad_atencion,
cargo_medico,
descuento_tercera_edad
) VALUES (
reg_atencion.ate_id,
reg_atencion.fecha_atencion,
reg_atencion.hr_atencion,
reg_atencion.costo,
reg_atencion.nombre_paciente,
reg_atencion.sistema_salud,
reg_atencion.nombre_medico,
reg_atencion.especialidad_medico,
reg_atencion.cargo_medico,
reg_atencion.fecha_venc_pago,
reg_atencion.monto_a_cancelar,
reg_atencion.unidad_atencion,
reg_atencion.cargo_medico,
reg_atencion.descuento_tercera_edad
);
END LOOP;

COMMIT;
END poblar_detalle_atenmedicas_mensuales;
/

-----****************************************-----
-----FUNCIONES PARA EL CALCULO DEL VARIABLES------

--FUNCION CALCULO DESCUENTO TERCERA EDAD.--


---*************************************---
CREATE OR REPLACE FUNCTION obtener_descuento_tercera_edad(p_pac_rut NUMBER) RETURN
NUMBER IS
v_edad NUMBER;
v_porcentaje NUMBER;
v_fecha_nacimiento DATE;
BEGIN
SELECT fecha_nacimiento INTO v_fecha_nacimiento
FROM PACIENTE
WHERE pac_rut = p_pac_rut;

SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, v_fecha_nacimiento) / 12)


INTO v_edad
FROM DUAL;

SELECT porcentaje_descto
INTO v_porcentaje
FROM PORC_DESCTO_3RA_EDAD
WHERE v_edad BETWEEN anno_ini AND anno_ter;

RETURN v_porcentaje;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END obtener_descuento_tercera_edad;
/
-- PRUEBA DE FUNCION CON PACIENTE RUT 3911077 SIN DV
EXEC
BEGIN
DBMS_OUTPUT.PUT_LINE('El descuento es: ' ||
obtener_descuento_tercera_edad(3911077));
END;
/

--------------------------------------------------
--- FUNCION PARA OBTENER ESPECIALIDAD MEDICO------
--------------------------------------------------
CREATE OR REPLACE FUNCTION obtener_especialidad_medico(p_med_run NUMBER) RETURN
VARCHAR2 IS
v_id_esp NUMBER;
v_nombre_esp VARCHAR2(25);
BEGIN
-- Lógica para obtener la especialidad del médico con el Rut proporcionado
SELECT m.esp_id INTO v_id_esp
FROM medico m
WHERE m.med_rut = p_med_run;

SELECT e.nombre INTO v_nombre_esp


FROM especialidad e
WHERE v_id_esp = e.esp_id;

RETURN v_nombre_esp;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- Manejar la excepción cuando no se encuentra el médico
RETURN NULL;
END obtener_especialidad_medico;
/
-- PRUEBA DE FUNCION CON MEDICO RUT 3126425 SIN DV
EXEC
BEGIN
DBMS_OUTPUT.PUT_LINE('La especialidad es: ' ||
obtener_especialidad_medico(3126425));
END;
/

------------------------------------------
----- FUNCION PARA UNIDAD ATENCION--------
------------------------------------------
CREATE OR REPLACE FUNCTION obtener_unidad_atencion(p_ate_id NUMBER) RETURN VARCHAR2
IS
v_unidad_id NUMBER;
v_nombre_unidad VARCHAR2(25);
BEGIN
SELECT u.uni_id
INTO v_unidad_id
FROM atencion a
JOIN medico m ON a.med_rut = m.med_rut
JOIN unidad u ON m.uni_id = u.uni_id
WHERE a.ate_id = p_ate_id;

SELECT u.nombre
INTO v_nombre_unidad
FROM unidad u
WHERE u.uni_id = v_unidad_id;

RETURN v_nombre_unidad;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL; -- Manejar la situación en la que no se encuentra la atención
médica
END obtener_unidad_atencion;
/
-- PRUEBA DE FUNCION CON ATENCION ID 279
EXEC
BEGIN
DBMS_OUTPUT.PUT_LINE('La unidad de atencion es: ' ||
obtener_unidad_atencion(279));
END;
/

------------------------------------------
------FUNCION_PARA_CARGO_MEDICO--------
------------------------------------------

CREATE OR REPLACE FUNCTION obtener_cargo_medico_func(p_med_rut NUMBER) RETURN


VARCHAR2 IS
v_cargo VARCHAR2(30);
v_car_id NUMBER;
BEGIN
SELECT car_id INTO v_car_id
FROM MEDICO
WHERE med_rut = p_med_rut;

SELECT c.nombre
INTO v_cargo
FROM cargo c
WHERE c.car_id = v_car_id;

RETURN v_cargo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL; -- Manejar la situación en la que no se encuentra el médico
END obtener_cargo_medico_func;
/
-- PRUEBA DE FUNCION CON RUT MEDICO 3126425 SIN DV
EXEC
BEGIN
DBMS_OUTPUT.PUT_LINE('El cargo del medico es: ' ||
obtener_cargo_medico_func(3126425));
END;
/

También podría gustarte