You are on page 1of 17

Primer disparador: generar automticamente el cdigo secreto que se forma sumando todos los dgitos uno a uno: Ej,:

28687766 el cdigo secreto es 2+8+6+8+7+7+6+6 =50.

Crear una tabla ALUMNOS con los siguientes datos:


DNI NUMBER(9) C_SECRETO NUMBER(3) NOMBRE VARCHAR2(40) MAXIMA_NOTA NUMBER (2)

CREATE TABLE ALUMNOS (DNI NUMBER(8) CONSTRAINT ID_DNI PRIMARY KEY, C_SECRETO NUMBER(3), NOMBRE VARCHAR2(40), MAXIMA_NOTA NUMBER (2));

create or replace trigger SECRETO before insert or update on alumnos for each row declare Cadena varchar2(8); Suma number(3) := 0; i binary_integer; longitud binary_integer; begin Cadena := TO_CHAR(:new.dni); Longitud := length(cadena); For i in 1.. longitud loop Suma := Suma + TO_NUMBER(SUBSTR(Cadena,i,1)); End loop; :new.c_secreto := Suma; end SECRETO;

Select * from alumnos; Insert into alumnos(dni, nombre) values (28687766, LOLA); Select * from alumnos;

Segundo disparador: El nombre debe estar en maysculas se escriba como se escriba en el insert o update (no hacerlo con constaint). create or replace trigger MAYUSCULAS before insert or update on alumnos for each row
begin :new.nombre := UPPER(:new.nombre); end MAYUSCULAS; insert into alumnos(dni,nombre) values (25252526, 'pepe'); select * from alumnos

Tercer disparador: El campo MAXIMA_NOTA debe ser la nota mayor del alumno en el fichero de NOTAS. Si no tiene ninguna debe ser cero.
Creamos la tabla asignaturas y notas

CREATE TABLE ASIGNATURAS (COD_ASIGNATURA VARCHAR2(2) CONSTRAINT ID_ASIG PRIMARY KEY, DES_ASIGNATURA VARCHAR2(40), FECHA_ANTIGEDAD DATE); CREATE TABLE NOTAS (DNI_N NUMBER(8), ASIGNATURA, Constraint FK_ASIG Foreign Key (ASIGNATURA) References ASIGNATURAS(COD_ASIGNATURA), Constraint ID_NOTAS PRIMARY Key (DNI_N, ASIGNATURA), NOTA NUMBER (2), FECHA_NOTA DATE);

create or replace trigger MaximaNota after insert or delete or update on NOTAS

declare vdni alumnos.dni%type; vmaxima alumnos.maxima_nota%type; error boolean; cursor obtendni is select dni from alumnos;

Begin open obtendni; loop fetch obtendni into vdni; exit when obtendni%NOTFOUND; begin error := FALSE; select max(nota) into vmaxima from notas where dni_n = vdni group by dni_n; exception when no_data_found then error := TRUE; end; If error=true then update alumnos set maxima_nota = 0 where dni = vdni; else update alumnos set maxima_nota = vmaxima where dni = vdni; end if; end loop; close obtendni; end MaximaNota

INSERT INTO NOTAS (DNI_N, ASIGNATURA, NOTA, FECHA_NOTA) VALUES (25252525, 'BD', 5, '01/02/2013'); SELECT * FROM ALUMNOS INSERT INTO NOTAS (DNI_N, ASIGNATURA, NOTA, FECHA_NOTA) VALUES (25252525, 'SI', 8, '01/02/2013'); SELECT * FROM ALUMNOS

Realizar un trigger tal que cuando se modifique una asignatura, deben eliminarse todas las notas de esa asignatura con fecha menor que la indicada en fecha de antigedad

create or replace trigger ACTUALIZAR after update on ASIGNATURAS for each row begin DELETE FROM NOTAS WHERE FECHA_NOTA < :new.fecha_antigedad and asignatura = :new.cod_asignatura; end ACTUALIZAR;

La fecha de antigedad no puede ser menor que 01/01/13 create or replace trigger FECHA before insert or update on ASIGNATURAS for each row

begin if :new.fecha_antigedad < '01/01/2013' or :new.fecha_antigedad is null then :new.fecha_antigedad := '01/01/2013'; end if; end FECHAS;

FUNCION PARA SABER SI UN ALUMNO TIENE O NO NOTA EN CIERTA ASIGNATURA.

create or replace function TIENENOTA (pdni IN notas.dni_n%type, pasignatura IN notas.asignatura%type) RETURN boolean as vdni notas.dni_n%type; vasignatura notas.asignatura%type; begin select dni_n, asignatura into vdni, vasignatura from notas where dni_n = pdni and asignatura = pasignatura; return true; exception when NO_DATA_FOUND then return false; end TIENENOTA;

You might also like