Está en la página 1de 3

--Triggers

--1.

--Paquete auxiliar
CREATE OR REPLACE PACKAGE PQ_AuxEjm1 IS
v_fac_id facultad.facultad_id%TYPE;
v_cantProf NUMBER := 0;
END;

--Trigger de fila (es before, se ejecuta antes del de sentencia)


Create or replace NONEDITIONABLE TRIGGER Ejm1
BEFORE INSERT OR UPDATE OF FACULTAD_ID ON profesor
FOR EACH ROW
BEGIN
PQ_AuxEjm1.v_fac_id := :NEW.FACULTAD_ID;
END;

--Trigger de sentencia (es AFTER, se ejecuta de último)


Create or replace NONEDITIONABLE TRIGGER Ejm11
AFTER INSERT OR UPDATE OF FACULTAD_ID ON profesor
BEGIN

--DBMS_OUTPUT.PUT_LINE('Valor de fac id:' || '' || PQ_AuxEjm1.v_fac_id );


SELECT COUNT(profesor.cedula) INTO PQ_AuxEjm1.v_cantProf FROM facultad JOIN
profesor ON
facultad.facultad_id = profesor.facultad_id
AND facultad.facultad_id = PQ_AuxEjm1.v_fac_id GROUP BY facultad.facultad_id;

--DBMS_OUTPUT.PUT_LINE('Valor de cont:' || '' || PQ_AuxEjm1.v_cantProf );


IF PQ_AuxEjm1.v_cantProf-1 >= 3 THEN
RAISE_APPLICATION_ERROR(-20500, 'No se admiten más de 3 docentes por facultad');
END IF;
END;

--Test
--SET SERVEROUTPUT ON;
INSERT INTO profesor VALUES (66245, 'Test Martinez', 2141500, 2);
UPDATE profesor SET facultad_id = 4 WHERE cedula = 21;

--3.

--Un profesor de la facultad 1 o 3 no puede tener un salario menor a un millón. Use


trigggers before.

CREATE OR REPLACE TRIGGER Ejm3


BEFORE INSERT OR UPDATE OF SALARIO ON PROFESOR FOR EACH ROW
DECLARE
BEGIN
IF(:NEW.FACULTAD_ID = 1 AND :NEW.SALARIO < 1000000) THEN
RAISE_APPLICATION_ERROR (-20202, 'Los profesores de la FIET no pueden ganar
menos de $1.000.000.');
ELSIF(:NEW.FACULTAD_ID = 3 AND :NEW.SALARIO < 1000000) THEN
RAISE_APPLICATION_ERROR (-20202, 'Los profesores de CIENCIAS CONTABLES no pueden
ganar
menos de $1.000.000.');

END IF;
END;
--Test
--SET SERVEROUTPUT ON;
INSERT INTO profesor VALUES (66245, 'Test Martinez', 900000, 3);
UPDATE profesor SET SALARIO = 900000 WHERE cedula = 2;

--4.

--Esta tabla está mutando cuando se usa la sentencia UPDATE


CREATE OR REPLACE TRIGGER Ejm4
BEFORE INSERT OR UPDATE OF PROGRAMA_ID ON ESTUDIANTE FOR EACH ROW
DECLARE
v_cantEst NUMBER := 0;
BEGIN
SELECT COUNT(estudiante.codigo) INTO v_cantEst FROM estudiante JOIN programa ON
estudiante.programa_id = programa.programa_id
AND PROGRAMA.PROGRAMA_ID = :NEW.PROGRAMA_ID
GROUP BY programa.nombre;
IF v_cantEst >=30 THEN
RAISE_APPLICATION_ERROR(-20500, 'NO SE ADMITEN MÁS DE 30 ESTUDIANTES POR
PROGRAMA');
END IF;
END;

--5
--Evite que se asocie un estudiante a un programa que pertenezca a una facultad sin
profesores. Recuerde que el
--campo Programa_Id del estudiante puede ser nulo.

create or replace NONEDITIONABLE TRIGGER Ejm5 AFTER


INSERT OR UPDATE OF PROGRAMA_ID ON ESTUDIANTE FOR EACH ROW

DECLARE
TYPE facSinProf IS TABLE OF programa.programa_id%TYPE;
v_tbl facSinProf;

BEGIN

SELECT programa.programa_id BULK COLLECT INTO v_tbl FROM Facultad JOIN PROGRAMA ON
facultad.facultad_id = programa.facultad_id WHERE facultad.nombre NOT IN
(
SELECT facultad.nombre FROM FACULTAD JOIN PROFESOR ON profesor.facultad_id =
facultad.facultad_id
GROUP BY facultad.nombre HAVING COUNT(profesor.cedula) > 0
);

IF :NEW.PROGRAMA_ID IS NULL THEN


RAISE_APPLICATION_ERROR(-20500, 'EL ID DEL PROGRAMA ES NULO');
ELSE
FOR i IN 1..v_tbl.COUNT LOOP
IF :NEW.PROGRAMA_ID = v_tbl(i) THEN
RAISE_APPLICATION_ERROR(-20500, 'NO SE ADMITEN ESTUDIANTES EN PROGRAMAS DE
FACULTADES SIN DOCENTES');
END IF;
END LOOP;
END IF;

END;
--Test
INSERT INTO estudiante VALUES (0104628,'Julian Prueba', 3.0, 12);
UPDATE estudiante SET programa_id = 12 WHERE codigo = 1;

También podría gustarte