TEXT
TRIGGER trigger_reserva
BEFORE INSERT OR UPDATE ON MESA_RESERVADA
REFERENCING NEW AS NOVO OLD AS ANTIGO
FOR EACH ROW
DECLARE
   reserva_invalida EXCEPTION;
   livre NUMBER;
   v_inicio TIMESTAMP;
   v_fim TIMESTAMP;
BEGIN
   SELECT inicio INTO v_inicio FROM RESERVA
   WHERE (:NOVO.id_reserva = id);
   SELECT fim INTO v_fim FROM RESERVA
   WHERE (:NOVO.id_reserva = id);
   livre := reserva_livre(v_inicio, v_fim, :NOVO.id_mesa);
   IF (livre = 0) THEN
       RAISE reserva_invalida;
   END IF;
EXCEPTION
   WHEN reserva_invalida THEN  RAISE_APPLICATION_ERROR(-20123, 'A mesa ' || TO_CHAR(:NOVO.id_mesa) || ' já possui reserva para este horário!');
END trigger_reserva;