Documentos de Académico
Documentos de Profesional
Documentos de Cultura
nombre=
PedroPerez
persona
reserva reservaUSER_ID_Pedro_Perez reserva
persona personaUSER_ID_Pedro_Perez persona
b)
SQL
-- a) Seleccionar habitaciones con capacidad superior a 200 personas
-- b) Seleccionar habitaciones ocupadas el 14 de junio del 2004 de 13:30 a 15:3
-- c) Seleccionar habitaciones libres
-- d) imprimir segun el formato requerido
--a) habitaciones con capacidad para mas de 200 personas
CREATE VIEW habitaciones_mas_200 AS
5
SELECT habitacion_ID
FROM habitacion
WHERE capacidad > 200;
--habitaciones que pueden alojar a mas de 200 personas ocupadas
-- el mircoles 14 de Julio del 2004 entre las 13:30 y
-- las 15:30
CREATE VIEW habitaciones_ocupadas AS
SELECT reserva.habitacion_ID, email --el atributo email sera
--necesario despues
FROM reserva,habitaciones_mas_200,persona
WHERE ((2004-08-14 13:30:00 between comienzo_reserva AND fin_reserva)
OR (2004-08-14 15:30:00 between comienzo_reserva AND fin_reserva))
AND reserva.habitacion_ID=habitaciones_mas_200.habitacion_ID
AND reserva.persona_ID=persona.persona_ID;
--habitaciones libres
CREATE VIEW habitaciones_libres AS
SELECT habitacion_ID
FROM(
SELECT habitacion_ID
FROM habitaciones_mas_200
EXCEPT
SELECT habitacion_ID
FROM habitaciones_ocupadas
) AS alias_inutil
;
--Resultado Final
SELECT habitacion_ID, email
FROM
(
(SELECT habitacion_ID, libre AS email, 0 AS orden
FROM habitaciones_libres
UNION --OJO: union no garantiza ningun ordenamiento
SELECT habitacion_ID,email, 1 AS orden
FROM habitaciones_ocupadas
) ORDER BY order
) AS otro_alias_inutil;
Algebra
habitaciones_mas_200
habitacion_id
capacidad>200
habitacion
A reserva habitaciones_mas_200 persona
habitaciones_ocupadas
reserva.habitacion_id,email
(2004081413: 3
0 > comienzoreserva
AND2004081413: 30 < f inreserva)
OR(2004081415: 30 > comienzoreserva
AND2004081415: 30 < f inreserva)
A
B
habitacion_id
habitaciones_mas_200
C
habitacion_id
habitaciones_ocupadas
habitaciones_libres BC
D
(order)
E
(order)
6
DD
(email)
DDD
habitacion_id,email,order
habitaciones_libres DDDds f d f s
EEE
habitacion_id,email,order
habitaciones_ocupadas E
habitacion_id,email
DDDEEE
Nota 1: 0, 1, email son relaciones compuestas por una tupla y con un solo atributo,
el valor de la tupla es 0, 1 y email respectivamente.
Nota 2: En principio no existe la operacion ordenar en algebra relacional, una relacion
por denicin no tiene order y la salida de todos los operadores de algebra lineal que hemos
visto son relaciones.
Programa (vease chero adjunto solucion1.pgc)
Ultima pregunta
Usando sql estandard no es posible que una base de datos interaccione con el exterior
(mande mails, imprima etc). Una posibilidad seria crear una tabla email
DROP SEQUENCE email_id_seq;
CREATE SEQUENCE email_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
SELECT setval(email_id_seq,0);
CREATE TABLE email (
id integer DEFAULT nextval(email_id_seq::text) NOT NULL,
"To" text NOT NULL,
"From" text NOT NULL,
"Subject" text NOT NULL,
"Message" text NOT NULL,
"Create_ON" date DEFAULT (now::text)::date,
PRIMARY KEY (id)
);
que se rellenaria automaticamente cada vez que se cancele una reserva mediante un trigger:
CREATE TRIGGER init_send_mail
AFTER DELETE ON reserva
FOR EACH ROW
EXECUTE PROCEDURE init_send_mail_fun();
CREATE FUNCTION init_send_mail_fun() RETURNS
-- aqui habria comandos para rellenar la tabla email
--
--
"trigger" AS
RETURN NEW;
END;
LANGUAGE plpgsql;
Finalmente un procedimiento externo gobernado por un cron deberia conectarse a la
base, leer la tabla de mails, enviarlos y borrar las entradas en la tabla. (Adjunto un ejemplo
de procedimiento externo escrito en python, vease chero sendmail.py)
7