Chequedo de dos fechas

Albert
31 de Mayo del 2005
Hola, soy novato en el tema de base de datos, y se me ha surgido un problema, necesito controlar que cuando realize un insert en una tabla determinada por ejempo estudiante, verifique que el campo fecha que esta en la tabla persona, no se mayor a determinada edad.
he querido realizar un trigger en el cual poder controlarlo, pero tengo la estrucutra basica de los trigger, por ejemplo
Create or Remplace Trigger Controlar_Edad
Before Insert or Update on Estudiante
For each row
Declare FNac as date, EdadActual as Number
Begin
Select Est_FNac
into FNac
From Persona
where Cod_est =: New:Cod_est
if :EDADactual<= trunc (((SysDate-FNac)/365),0)
if edadActual<21
Raise_application_error(-2001,Estudiante no valido')
end if
end if
end
/
no me esta dando, se ve que no tengo claro la estrucutura o el razonamiento que debe controlar la edad con respeto a las tablas involucradas

paz
31 de Mayo del 2005
prueba a poner una restricción check en la columna

rcabelloc
31 de Mayo del 2005
Te digo al igual que Paz, si la fecha a comparar es un número fijo en tu caso 21 utiliza una check constraint.

Ahora tienes varios puntos por los que no te puede funcionar dicho trigger:
1.- Faltan ; para teminar sentencias,
2.- If sin palabra THEN

Te hago llegar código que pienso que es optimo para lo que necesitas.

Create or Replace Trigger Controlar_Edad
Before Insert or Update on Estudiante
For each row
Declare

CURSOR C_FechaNac (pCodEst Persona.COD_EST%TYPE) IS
SELECT TRUNC((SYSDATE-EST_FAC)/365,0) EDAD_ACTUAL
FROM Persona
WHERE COD_EST = pCodEst;

Reg_FechaNac C_FechaNac%ROWTYPE;

BEGIN
OPEN C_FechaNac(:NEW.COD_EST);
FETCH C_FechaNac INTO Reg_FechaNac;
IF C_FechaNac%NOTFOUND THEN
CLOSE C_FechaNac;
Raise_Application_Error (-20101, 'No se encuentra en tabla Persona');
END IF;
CLOSE C_FechaNac;

IF (Reg_FechaNac.EDAD_ACTUAL <21) THEN
Raise_application_error(-20102,'Estudiante no valido');
END IF;

END;
/