0% encontró este documento útil (0 votos)
25 vistas3 páginas

Lab6 - Final

El documento define la estructura de dos tablas en una base de datos: 'colaboradores' y 'salario_quincenal', junto con secuencias para generar IDs únicos. Incluye procedimientos para insertar colaboradores y calcular salarios quincenales, considerando deducciones como seguro social y educativo. Además, se crea una vista para mostrar el cumplimiento de salarios de colaboradores activos con sus respectivos datos financieros.

Cargado por

David González
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
25 vistas3 páginas

Lab6 - Final

El documento define la estructura de dos tablas en una base de datos: 'colaboradores' y 'salario_quincenal', junto con secuencias para generar IDs únicos. Incluye procedimientos para insertar colaboradores y calcular salarios quincenales, considerando deducciones como seguro social y educativo. Además, se crea una vista para mostrar el cumplimiento de salarios de colaboradores activos con sus respectivos datos financieros.

Cargado por

David González
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

-- Tabla de colaboradores

CREATE TABLE colaboradores (


id_codcolaborador NUMBER PRIMARY KEY,
nombre VARCHAR2(25),
apellido VARCHAR2(25),
cedula VARCHAR2(12),
sexo CHAR(1),
fecha_nacimiento DATE,
fecha_ingreso DATE,
status CHAR(1),
salario_mensual NUMBER(15,2)
);

-- Tabla de salarios quincenales


CREATE TABLE salario_quincenal (
id_salario NUMBER PRIMARY KEY,
id_codcolaborador NUMBER,
fecha_pago DATE,
salario_quincenal NUMBER(15,2),
seguro_social NUMBER(15,2),
seguro_educativo NUMBER(15,2),
salario_neto NUMBER(15,2),
CONSTRAINT fk_colaborador FOREIGN KEY (id_codcolaborador)
REFERENCES colaboradores(id_codcolaborador)
);

-- Secuencia para IDs de colaboradores


CREATE SEQUENCE seq_id_colaborador
START WITH 1
INCREMENT BY 1
NOCACHE;

-- Secuencia para IDs de salarios


CREATE SEQUENCE seq_id_salario
START WITH 1
INCREMENT BY 1
NOCACHE;

SET SERVEROUTPUT ON;

DECLARE
v_id_codcolaborador colaboradores.id_codcolaborador%TYPE;
v_nombre [Link]%TYPE := '&nombre';
v_apellido [Link]%TYPE := '&apellido';
v_cedula [Link]%TYPE := '&cedula';
v_sexo [Link]%TYPE := '&sexo';
v_fecha_nacimiento DATE := TO_DATE('&fecha_nacimiento', 'YYYY-MM-DD');
v_fecha_ingreso DATE := TO_DATE('&fecha_ingreso', 'YYYY-MM-DD');
v_status [Link]%TYPE := '&status';
v_salario_mensual colaboradores.salario_mensual%TYPE := &salario_mensual;
BEGIN
SELECT seq_id_colaborador.NEXTVAL INTO v_id_codcolaborador FROM dual;

INSERT INTO colaboradores (


id_codcolaborador, nombre, apellido, cedula, sexo,
fecha_nacimiento, fecha_ingreso, status, salario_mensual
) VALUES (
v_id_codcolaborador, v_nombre, v_apellido, v_cedula, v_sexo,
v_fecha_nacimiento, v_fecha_ingreso, v_status, v_salario_mensual
);

DBMS_OUTPUT.PUT_LINE('Colaborador insertado con ID: ' || v_id_codcolaborador);


COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error al insertar colaborador: ' || SQLERRM);
END;
/

DECLARE
CURSOR cur_colaboradores IS
SELECT id_codcolaborador, salario_mensual
FROM colaboradores
WHERE status = 'A';

v_id_colaborador colaboradores.id_codcolaborador%TYPE;
v_salario_mensual colaboradores.salario_mensual%TYPE;

v_salario_quincenal salario_quincenal.salario_quincenal%TYPE;
v_seguro_social salario_quincenal.seguro_social%TYPE;
v_seguro_educativo salario_quincenal.seguro_educativo%TYPE;
v_ir NUMBER(15,2);
v_salario_neto salario_quincenal.salario_neto%TYPE;
v_id_salario salario_quincenal.id_salario%TYPE;

v_fecha_pago DATE := TO_DATE('&fecha_pago', 'YYYY-MM-DD');


BEGIN
IF TO_CHAR(v_fecha_pago, 'DD') NOT IN ('15', '30') THEN
RAISE_APPLICATION_ERROR(-20001, 'La fecha debe ser el día 15 o 30 del
mes.');
END IF;

OPEN cur_colaboradores;
LOOP
FETCH cur_colaboradores INTO v_id_colaborador, v_salario_mensual;
EXIT WHEN cur_colaboradores%NOTFOUND;

v_salario_quincenal := v_salario_mensual / 2;
v_seguro_social := v_salario_quincenal * 0.0975;
v_seguro_educativo := v_salario_quincenal * 0.0125;
v_ir := v_salario_quincenal * 0.15;
v_salario_neto := v_salario_quincenal - v_seguro_social -
v_seguro_educativo - v_ir;

SELECT seq_id_salario.NEXTVAL INTO v_id_salario FROM dual;

INSERT INTO salario_quincenal (


id_salario, id_codcolaborador, fecha_pago,
salario_quincenal, seguro_social, seguro_educativo, salario_neto
) VALUES (
v_id_salario, v_id_colaborador, v_fecha_pago,
v_salario_quincenal, v_seguro_social, v_seguro_educativo,
v_salario_neto
);
END LOOP;

CLOSE cur_colaboradores;
COMMIT;

DBMS_OUTPUT.PUT_LINE('Cálculo completado para fecha: ' || TO_CHAR(v_fecha_pago,


'DD-MM-YYYY'));
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/

CREATE OR REPLACE VIEW vista_cumplimiento_salarios AS


SELECT
c.id_codcolaborador AS codigo,
[Link],
[Link],
c.salario_mensual,
sq.salario_quincenal,
sq.seguro_social,
sq.seguro_educativo,
sq.salario_neto
FROM
colaboradores c
JOIN (
SELECT id_codcolaborador, salario_quincenal, seguro_social,
seguro_educativo, salario_neto, fecha_pago
FROM salario_quincenal sq1
WHERE fecha_pago = (
SELECT MAX(fecha_pago)
FROM salario_quincenal sq2
WHERE sq2.id_codcolaborador = sq1.id_codcolaborador
)
) sq ON c.id_codcolaborador = sq.id_codcolaborador
WHERE [Link] = 'A'
ORDER BY c.id_codcolaborador;

//consulta a la vista
SELECT
codigo,
nombre,
apellido,
salario_mensual,
ROUND(salario_quincenal, 2) AS salario_quincenal,
ROUND(seguro_social, 2) AS seguro_social,
ROUND(seguro_educativo, 2) AS seguro_educativo,
ROUND(salario_neto, 2) AS salario_neto
FROM
vista_cumplimiento_salarios
ORDER BY
codigo;

También podría gustarte