Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/03/2007, 11:28
rickymax
 
Fecha de Ingreso: febrero-2007
Ubicación: Ecuador
Mensajes: 23
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: Trigger En Oracle

Hola si estuve ocupando sqlplus pero mejor instale toad y bueno ya resolvi el problema aqui esta la BDD y el trigger por si algun navegante lo nesecita



--*********************************PRACTICA SQL MODELO ESCUELA : ESTUDIANTES , MATERIA , NOTA********
/* ENUNCIADO:
Crear una base de datos que tenga 3 tablas estudiantes , materias, Notas (nota1, nota2, nota3) (y una tabla mensaje es opcional )
controlar la integridad ) crear un trigger que controle que cada vez que se asiente las notas
se sumen las 3 notas parciales en la tabla Nota y guarde el resultado en la BDD , ademas crear
un triger que permita ingresar automaticamente "aprobado" o "no aprobado" esto depende de las
notas parciales en NOTA*/


/* CREADO POR : RICARDO RUANO
UNIVERSIDAD TECNICA DEL NORTE
ESCUELA DE INGENIERIA EN SISTEMAS COMPUTACIONALES
IBARRA - ECUADOR
[email protected]
*/

create table Estudiante
(
Codigo Integer,
Nombre Varchar(10)
)

alter table Estudiante
add(Primary Key (Codigo))

create table Materias(
CodigoM Integer,
NombreM Varchar(10))

alter table Materias
add (primary Key (CodigoM))


CREATE TABLE NOTA
(
CODIGONOTA INTEGER,
CODIGOE INTEGER,
CODIGOM INTEGER,
NOTA1 FLOAT DEFAULT 0,
NOTA2 FLOAT DEFAULT 0,
NOTA3 FLOAT DEFAULT 0
)

ALTER TABLE NOTA ADD (
CONSTRAINT FK_REFER_EST
FOREIGN KEY (CODIGOE)
REFERENCES ESTUDIANTE (CODIGO))

ALTER TABLE NOTA ADD (
CONSTRAINT FK_REFER_MAT
FOREIGN KEY (CODIGOM)
REFERENCES MATERIAS (CODIGOM))

ALTER TABLE NOTA ADD(
PRIMARY KEY (CODIGONOTA))

create table Mensaje
(
codigoNota INTEGER,
Suma float default 0,
Mens varchar(10) default 'Reprobado'
)

ALTER TABLE MENSAJE ADD
(PRIMARY KEY (CODIGONOTA))

ALTER TABLE MENSAJE ADD
( CONSTRAINT FK_REFER_NOT
FOREIGN KEY (codigoNota)
REFERENCES NOTA (CODIGONOTA))



CREATE OR REPLACE TRIGGER "calc_Aprobado"

AFTER INSERT OR UPDATE ON NOTA
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
--VARIABLES LOCALES
--sumatoria de las notas
v_ins_sum_notas float;
v_promedio float;

BEGIN
--***1)SI ES INSERCION DE DATOS***
IF INSERTING THEN
--comprobar primero si hay las tres notas a sumar
IF :new.nota1 is not null and :new.nota2 is not null and :new.nota3 is not null THEN
--sumar las 3 primeras notas sin supletorio
v_ins_sum_notas := (:new.nota1 + :new.nota2 + :new.nota3);

--comprobar si es mayor o igual a 21 si es asi APROBADO)
IF v_ins_sum_notas >= 21 THEN
--entonces poner APROBADO
v_promedio :=v_ins_sum_notas/3;
INSERT INTO MENSAJE VALUES (:NEW.CODIGONOTA,v_promedio,'APROBADO');

--DE LO CONTRARIO
ELSIF v_ins_sum_notas < 21 THEN
v_promedio :=v_ins_sum_notas/3;
INSERT INTO MENSAJE VALUES (:NEW.CODIGONOTA,v_promedio,'NOAPROBAD');
END IF;
END IF;
END IF;

--***2)SI ES ACTUALIZACION DE DATOS***
IF UPDATING THEN
--comprobar primero si hay las tres notas a sumar
IF :new.nota1 is not null and :new.nota2 is not null and :new.nota3 is not null THEN
--sumar las 3 primeras notas sin supletorio
v_ins_sum_notas := (:new.nota1 + :new.nota2 + :new.nota3);

--comprobar si es mayor o igual a 21 si es asi APROBADO)
IF v_ins_sum_notas >= 21 THEN
--entonces poner APROBADO
v_promedio :=v_ins_sum_notas/3;
UPDATE MENSAJE SET SUMA= v_promedio ,mens='APROBADO' where codigoNota = :new.codigonota;

--DE LO CONTRARIO
ELSIF v_ins_sum_notas < 21 THEN
v_promedio :=v_ins_sum_notas/3;
UPDATE MENSAJE SET SUMA= v_promedio ,mens='NOAPROBAD' where codigoNota = :new.codigonota;
END IF;
END IF;
END IF;

END;

insert into Nota (CODIGONOTA,CodigoE, CodigoM,Nota1, Nota2,Nota3) values (1,1,2,10,9,7)
insert into Nota (CODIGONOTA,CodigoE, CodigoM,Nota1, Nota2,Nota3) values (2,1,3,10,9,7)
insert into Nota (CODIGONOTA,CodigoE, CodigoM,Nota1, Nota2,Nota3) values (3,1,1,3,6,4)
UPDATE NOTA SET NOTA1= 3,NOTA2=3 WHERE CODIGONOTA = 2
SELECT * FROM nota
SELECT * FROM MENSAJE