initial commit

This commit is contained in:
Sebastian Seedorf
2020-12-06 12:40:52 +01:00
commit ff6962de52
10 changed files with 7955 additions and 0 deletions

138
01-create.sql Normal file
View File

@@ -0,0 +1,138 @@
USE db_vorlesung;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS Saal;
DROP TABLE IF EXISTS Sitzplatz;
DROP TABLE IF EXISTS Reservierung;
DROP TABLE IF EXISTS Reservierung_Log;
DROP TABLE IF EXISTS Vorstellung;
DROP TABLE IF EXISTS Film;
DROP TABLE IF EXISTS Schauspieler;
DROP TABLE IF EXISTS nm_Reservierung_Sitzplatz;
DROP TABLE IF EXISTS nm_Film_Schauspieler;
SET FOREIGN_KEY_CHECKS = 1;
CREATE TABLE IF NOT EXISTS Saal (
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
Beschreibung MEDIUMTEXT,
UNIQUE u_saal_name (Name)
);
CREATE TABLE IF NOT EXISTS Sitzplatz (
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Reihe INTEGER UNSIGNED NOT NULL,
Platz INTEGER UNSIGNED NOT NULL,
Preis FLOAT UNSIGNED NOT NULL,
fk_Saal_ID INTEGER UNSIGNED NOT NULL,
UNIQUE u_sitzplatz (Reihe, Platz, fk_Saal_ID),
CONSTRAINT fk_sitzplatz_saal_id
FOREIGN KEY (fk_Saal_ID)
REFERENCES Saal (ID)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS Schauspieler (
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Vorname VARCHAR(255) NOT NULL,
Nachname VARCHAR(255) NOT NULL,
Geburtstag DATE
);
CREATE TABLE IF NOT EXISTS Film (
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
Spieldauer INTEGER UNSIGNED NOT NULL,
Bewertung FLOAT UNSIGNED NOT NULL,
Beschreibung MEDIUMTEXT,
INDEX i_film_name (Name)
);
CREATE TABLE IF NOT EXISTS Vorstellung (
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Beginn DATETIME NOT NULL,
fk_Film_ID INTEGER UNSIGNED NOT NULL,
fk_Saal_ID INTEGER UNSIGNED NOT NULL,
CONSTRAINT fk_vorstellung_film_id
FOREIGN KEY (fk_Film_ID)
REFERENCES Film (ID)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT fk_vorstellung_saal_id
FOREIGN KEY (fk_Saal_ID)
REFERENCES Saal (ID)
ON UPDATE CASCADE
ON DELETE RESTRICT
);
CREATE TABLE IF NOT EXISTS Reservierung (
ID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
Vorname VARCHAR(255) NOT NULL,
Nachname VARCHAR(255) NOT NULL,
Mail VARCHAR(255) NOT NULL,
fk_Vorstellung_ID INTEGER UNSIGNED NOT NULL,
INDEX i_reservierung_name (Vorname, Nachname),
INDEX i_reservierung_name2 (Nachname),
CONSTRAINT fk_reservierung_vorstellung_id
FOREIGN KEY (fk_Vorstellung_ID)
REFERENCES Vorstellung (ID)
ON UPDATE CASCADE
ON DELETE RESTRICT
);
CREATE TABLE Reservierung_Log LIKE Reservierung;
select
concat('ALTER TABLE Reservierung_Log', GROUP_CONCAT(' MODIFY COLUMN ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE)) as alter_statement INTO @prep_statement
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'NO'
and c.TABLE_SCHEMA = 'db_vorlesung'
and c.TABLE_NAME = 'Reservierung_Log'
group by c.TABLE_NAME;
PREPARE query_nullable FROM @prep_statement;
EXECUTE query_nullable;
DEALLOCATE PREPARE query_nullable;
ALTER TABLE Reservierung_Log DROP PRIMARY KEY;
ALTER TABLE Reservierung_Log ADD `LogID` INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY FIRST;
ALTER TABLE Reservierung_Log ADD `VorheigeID` INTEGER UNSIGNED;
ALTER TABLE Reservierung_Log ADD `Zeitstempel` TIMESTAMP DEFAULT CURRENT_TIMESTAMP() NOT NULL;
ALTER TABLE Reservierung_Log ADD `is_Erfolgreich` BIT NOT NULL;
ALTER TABLE Reservierung_Log ADD `Methode` ENUM ('insert', 'update', 'delete') NOT NULL;
CREATE TABLE IF NOT EXISTS nm_Film_Schauspieler (
fk_Film_ID INTEGER UNSIGNED NOT NULL,
fk_Schauspieler_ID INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (fk_Film_ID, fk_Schauspieler_ID),
CONSTRAINT fk_nm_film_schauspieler_film_id
FOREIGN KEY (fk_Film_ID)
REFERENCES Film (ID)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT fk_nm_film_schauspieler_schauspieler_id
FOREIGN KEY (fk_Schauspieler_ID)
REFERENCES Schauspieler (ID)
ON UPDATE CASCADE
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS nm_Reservierung_Sitzplatz (
fk_Reservierung_ID INTEGER UNSIGNED NOT NULL,
fk_Sitzplatz_ID INTEGER UNSIGNED NOT NULL,
PRIMARY KEY pk_nm_reservierung_sitzplatz_reservierung (fk_Reservierung_ID, fk_Sitzplatz_ID),
CONSTRAINT fk_nm_reservierung_sitzplatz_reservierung_id
FOREIGN KEY (fk_Reservierung_ID)
REFERENCES Reservierung (ID)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT fk_nm_reservierung_sitzplatz_sitzplatz_id
FOREIGN KEY (fk_Sitzplatz_ID)
REFERENCES Sitzplatz (ID)
ON UPDATE CASCADE
ON DELETE CASCADE
);

47
02-views.sql Normal file
View File

@@ -0,0 +1,47 @@
DROP VIEW IF EXISTS v_Film;
CREATE VIEW v_Film AS
SELECT
Film.*,
GROUP_CONCAT(CONCAT_WS(' ', Schauspieler.Vorname, Schauspieler.Nachname) SEPARATOR ', ') AS SchauspielerListe
FROM Film
LEFT JOIN nm_Film_Schauspieler ON Film.ID = nm_Film_Schauspieler.fk_Film_ID
LEFT JOIN Schauspieler ON nm_Film_Schauspieler.fk_Schauspieler_ID = Schauspieler.ID
GROUP BY Film.ID
ORDER BY Film.Name ASC, Film.Bewertung DESC
;
DROP VIEW IF EXISTS v_Saal;
CREATE VIEW v_Saal AS
SELECT
Saal.ID, Saal.Name, Saal.Beschreibung,
COUNT(Sitzplatz.ID) Sitzanzahl
FROM Saal
LEFT JOIN Sitzplatz ON Saal.ID = Sitzplatz.fk_Saal_ID
GROUP BY Saal.ID, Saal.Name, Saal.Beschreibung
ORDER BY Saal.Name
;
DROP VIEW IF EXISTS v_Vorstellung;
CREATE VIEW v_Vorstellung AS
SELECT
Vorstellung.ID,
Vorstellung.Beginn,
DATE_ADD(Vorstellung.Beginn, INTERVAL v_Film.Spieldauer MINUTE) Ende,
v_Film.Name Filmname,
v_Film.Beschreibung,
v_Film.Bewertung,
v_Film.SchauspielerListe,
v_Saal.Name Saalname,
COUNT(DISTINCT Reservierung.ID) Reservierungen,
COUNT(Sitzplatz.ID) Platzreservierungen,
CAST(COUNT(Sitzplatz.ID)/v_Saal.Sitzanzahl AS DECIMAL(5, 4)) Ausbuchung,
COALESCE(SUM(Sitzplatz.Preis), 0) `Einnahmen`
FROM Vorstellung
JOIN v_Film ON Vorstellung.fk_Film_ID=v_Film.ID
JOIN v_Saal ON Vorstellung.fk_Saal_ID = v_Saal.ID
LEFT JOIN Reservierung ON Vorstellung.ID = Reservierung.fk_Vorstellung_ID
LEFT JOIN nm_Reservierung_Sitzplatz ON Reservierung.ID = nm_Reservierung_Sitzplatz.fk_Reservierung_ID
LEFT JOIN Sitzplatz ON nm_Reservierung_Sitzplatz.fk_Sitzplatz_ID = Sitzplatz.ID
GROUP BY Vorstellung.Beginn, v_Film.Spieldauer, v_Film.Name, v_Film.Beschreibung, v_Film.Bewertung, v_Film.SchauspielerListe, v_Saal.Name
ORDER BY Vorstellung.Beginn ASC, v_Saal.Name ASC
;

248
03-trigger.sql Normal file
View File

@@ -0,0 +1,248 @@
DELIMITER $$
DROP TRIGGER IF EXISTS `schauspieler_bri`$$
CREATE TRIGGER `schauspieler_bri`
BEFORE INSERT ON Schauspieler
FOR EACH ROW
BEGIN
IF NOT film_pub_chk_geburtstag(NEW.Geburtstag) THEN
SIGNAL SQLSTATE '60000' SET MESSAGE_TEXT = 'Geburtstag ist ungültig!';
END IF;
END $$
DROP TRIGGER IF EXISTS `schauspieler_bru`$$
CREATE TRIGGER `schauspieler_bru`
BEFORE UPDATE ON Schauspieler
FOR EACH ROW
BEGIN
IF NOT film_pub_chk_geburtstag(NEW.Geburtstag) THEN
SIGNAL SQLSTATE '60001' SET MESSAGE_TEXT = 'Geburtstag ist ungültig!';
END IF;
END $$
DROP TRIGGER IF EXISTS `reservierung_bri`$$
CREATE TRIGGER `reservierung_bri`
BEFORE INSERT ON Reservierung
FOR EACH ROW
BEGIN
-- Logging
INSERT INTO Reservierung_Log (ID, Vorname, Nachname, Mail, fk_Vorstellung_ID, VorheigeID, Zeitstempel, is_Erfolgreich, Methode)
VALUES (NEW.ID, NEW.Vorname, NEW.Nachname, NEW.Mail, NEW.fk_Vorstellung_ID, NULL, CURRENT_TIMESTAMP(), 0, 'insert');
SET @letzte_reservation_ID = LAST_INSERT_ID();
-- Check Mail
IF NOT res_pub_chk_mail(NEW.Mail) THEN
SIGNAL SQLSTATE '60020' SET MESSAGE_TEXT = 'Mail-Adresse ist ungültig!';
END IF;
END $$
DROP TRIGGER IF EXISTS `reservierung_bru`$$
CREATE TRIGGER `reservierung_bru`
BEFORE UPDATE ON Reservierung
FOR EACH ROW
BEGIN
-- Logging
INSERT INTO Reservierung_Log (ID, Vorname, Nachname, Mail, fk_Vorstellung_ID, VorheigeID, Zeitstempel, is_Erfolgreich, Methode)
VALUES (NEW.ID, NEW.Vorname, NEW.Nachname, NEW.Mail, NEW.fk_Vorstellung_ID, OLD.ID, CURRENT_TIMESTAMP(), 0, 'insert');
SET @letzte_reservation_ID = LAST_INSERT_ID();
-- Check Mail
IF NOT res_pub_chk_mail(NEW.Mail) THEN
SIGNAL SQLSTATE '60021' SET MESSAGE_TEXT = 'Mail-Adresse ist ungültig!';
END IF;
END $$
DROP TRIGGER IF EXISTS `reservierung_brd`$$
CREATE TRIGGER `reservierung_brd`
BEFORE DELETE ON Reservierung
FOR EACH ROW
BEGIN
-- Logging
INSERT INTO Reservierung_Log (VorheigeID, Zeitstempel, is_Erfolgreich, Methode) VALUES (OLD.ID, CURRENT_TIMESTAMP(), 0, 'delete');
SET @letzte_reservation_ID = LAST_INSERT_ID();
END $$
DROP TRIGGER IF EXISTS `reservierung_ari`$$
CREATE TRIGGER `reservierung_ari`
AFTER INSERT ON Reservierung
FOR EACH ROW
BEGIN
-- Logging
UPDATE Reservierung_Log SET is_Erfolgreich=1, ID=NEW.ID WHERE LogID=@letzte_reservation_ID;
END $$
DROP TRIGGER IF EXISTS `reservierung_aru`$$
CREATE TRIGGER `reservierung_aru`
AFTER UPDATE ON Reservierung
FOR EACH ROW
BEGIN
-- Logging
UPDATE Reservierung_Log SET is_Erfolgreich=1 WHERE LogID=@letzte_reservation_ID;
END $$
DROP TRIGGER IF EXISTS `reservierung_ard`$$
CREATE TRIGGER `reservierung_ard`
AFTER DELETE ON Reservierung
FOR EACH ROW
BEGIN
-- Logging
UPDATE Reservierung_Log SET is_Erfolgreich=1 WHERE LogID=@letzte_reservation_ID;
END $$
DROP TRIGGER IF EXISTS `sitzplatz_bri`$$
CREATE TRIGGER `sitzplatz_bri`
BEFORE INSERT ON Sitzplatz
FOR EACH ROW
BEGIN
IF NEW.Preis>100 THEN
SIGNAL SQLSTATE '60030' SET MESSAGE_TEXT = 'Preis ist ungültig! Ein Sitzplatz darf maximal 100€ kosten.';
END IF;
END $$
DROP TRIGGER IF EXISTS `sitzplatz_bru`$$
CREATE TRIGGER `sitzplatz_bru`
BEFORE UPDATE ON Sitzplatz
FOR EACH ROW
BEGIN
IF NEW.Preis>100 THEN
SIGNAL SQLSTATE '60031' SET MESSAGE_TEXT = 'Preis ist ungültig! Ein Sitzplatz darf maximal 100€ kosten.';
END IF;
END $$
DROP TRIGGER IF EXISTS `nm_reservierung_sitzplatz_bri` $$
CREATE TRIGGER `nm_reservierung_sitzplatz_bri`
BEFORE INSERT ON nm_Reservierung_Sitzplatz
FOR EACH ROW
BEGIN
IF EXISTS(
SELECT fk_Sitzplatz_ID FROM nm_Reservierung_Sitzplatz nm
JOIN Reservierung re ON nm.fk_Reservierung_ID = re.ID
WHERE (re.fk_Vorstellung_ID=(SELECT r.fk_Vorstellung_ID FROM Reservierung r WHERE r.ID=NEW.fk_Reservierung_ID))
AND fk_Sitzplatz_ID=NEW.fk_Sitzplatz_ID
) THEN
SIGNAL SQLSTATE '60040' SET MESSAGE_TEXT = 'Sitzplatz ist für diese Vorstellung bereits reserviert!';
END IF;
END $$
DROP TRIGGER IF EXISTS `nm_reservierung_sitzplatz_bru` $$
CREATE TRIGGER `nm_reservierung_sitzplatz_bru`
BEFORE UPDATE ON nm_Reservierung_Sitzplatz
FOR EACH ROW
BEGIN
IF EXISTS(
SELECT fk_Sitzplatz_ID FROM nm_Reservierung_Sitzplatz nm
JOIN Reservierung re ON nm.fk_Reservierung_ID = re.ID
WHERE (re.fk_Vorstellung_ID=(SELECT r.fk_Vorstellung_ID FROM Reservierung r WHERE r.ID=NEW.fk_Reservierung_ID))
AND fk_Sitzplatz_ID=NEW.fk_Sitzplatz_ID
) THEN
SIGNAL SQLSTATE '60041' SET MESSAGE_TEXT = 'Sitzplatz ist für diese Vorstellung bereits reserviert!';
END IF;
END $$
DROP TRIGGER IF EXISTS `vorstellung_bri` $$
CREATE TRIGGER `vorstellung_bri`
BEFORE INSERT ON Vorstellung
FOR EACH ROW
BEGIN
DECLARE v_saalname VARCHAR(50);
DECLARE v_spieldauer INTEGER UNSIGNED;
SELECT Saal.Name INTO v_saalname FROM Saal WHERE Saal.ID=NEW.fk_Saal_ID;
SELECT Film.Spieldauer INTO v_spieldauer FROM Film WHERE Film.ID=NEW.fk_Film_ID;
IF EXISTS(
SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname
FROM v_Vorstellung
WHERE v_saalname=Saalname
AND NEW.Beginn<v_Vorstellung.Ende
AND DATE_ADD(NEW.Beginn, INTERVAL v_spieldauer MINUTE)>v_Vorstellung.Beginn
) THEN
SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!';
END IF;
END $$
DROP TRIGGER IF EXISTS `vorstellung_bru` $$
CREATE TRIGGER `vorstellung_bru`
BEFORE UPDATE ON Vorstellung
FOR EACH ROW
BEGIN
DECLARE v_saalname VARCHAR(50);
DECLARE v_spieldauer INTEGER UNSIGNED;
SELECT Saal.Name INTO v_saalname FROM Saal WHERE Saal.ID=NEW.fk_Saal_ID;
SELECT Film.Spieldauer INTO v_spieldauer FROM Film WHERE Film.ID=NEW.fk_Film_ID;
IF EXISTS(
SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname
FROM v_Vorstellung
WHERE v_saalname=Saalname
AND NEW.Beginn<v_Vorstellung.Ende
AND DATE_ADD(NEW.Beginn, INTERVAL v_spieldauer MINUTE)>v_Vorstellung.Beginn
AND v_Vorstellung.ID <> OLD.ID
) THEN
SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!';
END IF;
END $$
DROP TRIGGER IF EXISTS `film_bru` $$
CREATE TRIGGER `film_bru`
BEFORE UPDATE ON Film
FOR EACH ROW
BEGIN
DECLARE v_saalname VARCHAR(50);
DECLARE v_beginn DATETIME;
DECLARE vc_vorstellung_col, vc_vorstellung_done INT DEFAULT 0;
DECLARE vc_vorstellung CURSOR FOR SELECT ID FROM Vorstellung WHERE fk_Film_ID=NEW.ID;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vc_vorstellung_done = 1;
if (NEW.Spieldauer > OLD.Spieldauer) THEN
SET vc_vorstellung_done = 0;
OPEN vc_vorstellung;
FETCH vc_vorstellung INTO vc_vorstellung_col;
WHILE NOT vc_vorstellung_done DO
SELECT Saal.Name INTO v_saalname
FROM Vorstellung
JOIN Saal ON Vorstellung.fk_Saal_ID = Saal.ID
WHERE Vorstellung.ID=vc_vorstellung_col;
SELECT Vorstellung.Beginn INTO v_beginn
FROM Vorstellung
WHERE Vorstellung.ID=vc_vorstellung_col;
IF EXISTS(
SELECT v_Vorstellung.Beginn, v_Vorstellung.Ende, v_Vorstellung.Saalname
FROM v_Vorstellung
WHERE v_saalname=Saalname
AND v_beginn<v_Vorstellung.Ende
AND DATE_ADD(v_beginn, INTERVAL NEW.Spieldauer MINUTE)>v_Vorstellung.Beginn
AND v_Vorstellung.ID <> vc_vorstellung_col
) THEN
SIGNAL SQLSTATE '60050' SET MESSAGE_TEXT = 'Vorstellung überschneidet sich mit anderen Vorstellungen in einem Saal!';
END IF;
SET vc_vorstellung_done = 0;
FETCH vc_vorstellung INTO vc_vorstellung_col;
END WHILE;
CLOSE vc_vorstellung;
END IF;
END $$
DELIMITER ;

68
04-package-film.sql Normal file
View File

@@ -0,0 +1,68 @@
DELIMITER $$
-- Schauspieler-Film-Package
DROP FUNCTION IF EXISTS film_pub_chk_geburtstag$$
CREATE FUNCTION film_pub_chk_geburtstag(p_geburtstag DATETIME)
RETURNS BIT
BEGIN
IF EXISTS(SELECT 1 FROM (SELECT 1) t WHERE p_geburtstag BETWEEN '1900-01-01' AND '2099-12-31')
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END $$
DROP FUNCTION IF EXISTS film_priv_search_schauspieler$$
CREATE FUNCTION film_priv_search_schauspieler (p_vorname VARCHAR(255), p_nachname VARCHAR(255))
RETURNS INTEGER UNSIGNED
BEGIN
DECLARE res INTEGER UNSIGNED;
DECLARE EXIT HANDLER FOR 1172 BEGIN
SIGNAL SQLSTATE '50000' SET MESSAGE_TEXT = 'Mehr als ein Schauspieler mit dem Namen gefunden!';
END;
SELECT Schauspieler.ID INTO res FROM Schauspieler WHERE Vorname=p_vorname AND Nachname=p_nachname;
IF res IS NULL THEN
SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Kein Schauspieler mit dem Namen gefunden!';
END IF;
RETURN res;
END $$
DROP FUNCTION IF EXISTS `film_pub_search_film`$$
CREATE FUNCTION `film_pub_search_film` (p_filmname VARCHAR(255))
RETURNS INTEGER UNSIGNED
BEGIN
DECLARE res INTEGER UNSIGNED;
DECLARE EXIT HANDLER FOR 1172 BEGIN
SIGNAL SQLSTATE '50010' SET MESSAGE_TEXT = 'Mehr als einen Film mit dem Titel gefunden!';
END;
SELECT Film.ID INTO res FROM Film WHERE Name=p_filmname;
IF res IS NULL THEN
SIGNAL SQLSTATE '50011' SET MESSAGE_TEXT = 'Keinen Film mit dem Titel gefunden!';
END IF;
RETURN res;
END $$
DROP PROCEDURE IF EXISTS `film_pub_add_schauspieler_film`$$
CREATE PROCEDURE `film_pub_add_schauspieler_film` (p_vorname VARCHAR(255), p_nachname VARCHAR(255), p_filmname VARCHAR(255))
BEGIN
DECLARE EXIT HANDLER FOR 1062 BEGIN
SIGNAL SQLSTATE '50022' SET MESSAGE_TEXT = 'Schauspieler-Film-Beziehung schon vorhanden!';
END;
INSERT INTO nm_Film_Schauspieler (fk_Film_ID, fk_Schauspieler_ID) VALUES (film_pub_search_film(p_filmname), film_priv_search_schauspieler(p_vorname, p_nachname));
END $$
DELIMITER ;

117
05-package-saal.sql Normal file
View File

@@ -0,0 +1,117 @@
DELIMITER $$
-- Saal-Package
DROP FUNCTION IF EXISTS `saal_pub_search_saal`$$
CREATE FUNCTION `saal_pub_search_saal` (p_saalname VARCHAR(255))
RETURNS INTEGER UNSIGNED
BEGIN
DECLARE res INTEGER UNSIGNED;
SELECT Saal.ID INTO res FROM Saal WHERE Name=p_saalname;
IF res IS NULL THEN
SIGNAL SQLSTATE '50101' SET MESSAGE_TEXT = 'Kein Saal mit dem Namen gefunden!';
END IF;
RETURN res;
END $$
DROP FUNCTION IF EXISTS saal_pub_search_sitzplatz_saalID$$
CREATE FUNCTION saal_pub_search_sitzplatz_saalID (p_saalID INTEGER UNSIGNED, p_reihe INTEGER UNSIGNED, p_platz INTEGER UNSIGNED)
RETURNS INTEGER UNSIGNED
BEGIN
DECLARE res INTEGER UNSIGNED;
SELECT Sitzplatz.ID INTO res FROM Sitzplatz WHERE fk_Saal_ID=p_saalID AND Reihe=p_reihe AND Platz=p_platz;
IF res IS NULL THEN
SIGNAL SQLSTATE '50111' SET MESSAGE_TEXT = 'Kein Sitzplatz gefunden!';
END IF;
RETURN res;
END $$
DROP FUNCTION IF EXISTS `saal_pub_search_sitzplatz`$$
CREATE FUNCTION `saal_pub_search_sitzplatz` (p_saalname VARCHAR(255), p_reihe INTEGER UNSIGNED, p_platz INTEGER UNSIGNED)
RETURNS INTEGER UNSIGNED
BEGIN
RETURN saal_pub_search_sitzplatz_saalID(saal_pub_search_saal(p_saalname), p_reihe, p_platz);
END $$
DROP PROCEDURE IF EXISTS `saal_pub_add_saal3`$$
CREATE PROCEDURE `saal_pub_add_saal3` (p_saalname VARCHAR(50))
BEGIN
CALL saal_pub_add_saal2(p_saalname, NULL);
END $$
DROP PROCEDURE IF EXISTS `saal_pub_add_saal2`$$
CREATE PROCEDURE `saal_pub_add_saal2` (p_saalname VARCHAR(50), p_beschreibung MEDIUMTEXT)
BEGIN
CALL saal_pub_add_saal(p_saalname, p_beschreibung, 0, 0, 0);
END $$
DROP PROCEDURE IF EXISTS `saal_pub_add_saal1`$$
CREATE PROCEDURE `saal_pub_add_saal1` (p_saalname VARCHAR(50), p_reihen INTEGER UNSIGNED, p_breite INTEGER UNSIGNED, p_preis FLOAT UNSIGNED)
BEGIN
CALL saal_pub_add_saal(p_saalname, NULL, p_reihen, p_breite, p_preis);
END $$
DROP PROCEDURE IF EXISTS `saal_pub_add_saal`$$
CREATE PROCEDURE `saal_pub_add_saal` (p_saalname VARCHAR(50), p_beschreibung MEDIUMTEXT, p_reihen INTEGER UNSIGNED, p_breite INTEGER UNSIGNED, p_preis FLOAT UNSIGNED)
BEGIN
DECLARE EXIT HANDLER FOR 1062 BEGIN -- [1062] Duplicate entry 'xxx' for key 'u_saal_name'
SIGNAL SQLSTATE '50120' SET MESSAGE_TEXT = 'Saal mit dem Namen existiert bereits!';
END;
INSERT INTO Saal (Name, Beschreibung) VALUES (p_saalname, p_beschreibung);
CALL saal_pub_update_preis(p_saalname, 1, p_reihen, 1, p_breite, p_preis);
END $$
DROP PROCEDURE IF EXISTS `saal_pub_update_preis`$$
CREATE PROCEDURE `saal_pub_update_preis` (
p_saalname VARCHAR(50),
p_start_reihe INTEGER UNSIGNED,
p_ende_reihe INTEGER UNSIGNED,
p_start_breite INTEGER UNSIGNED,
p_ende_breite INTEGER UNSIGNED,
p_preis FLOAT UNSIGNED
)
BEGIN
DECLARE v_reihe INTEGER UNSIGNED DEFAULT p_start_reihe;
DECLARE v_breite INTEGER UNSIGNED DEFAULT p_start_breite;
DECLARE v_saalID INTEGER UNSIGNED DEFAULT saal_pub_search_saal(p_saalname);
WHILE v_reihe <= p_ende_reihe DO
SET v_breite = 1;
WHILE v_breite <= p_ende_breite DO
INSERT INTO Sitzplatz (Reihe, Platz, fk_Saal_ID, Preis)
VALUES (v_reihe, v_breite, v_saalID, p_preis)
ON DUPLICATE KEY UPDATE Preis=p_preis;
SET v_breite = v_breite+1;
END WHILE;
SET v_reihe = v_reihe+1;
END WHILE;
END $$
DELIMITER ;

View File

@@ -0,0 +1,13 @@
DELIMITER $$
-- Vorstellung-Package
DROP PROCEDURE IF EXISTS `vrst_pub_add_vorstellung`$$
CREATE PROCEDURE `vrst_pub_add_vorstellung` (p_saalname VARCHAR(50), p_filmname VARCHAR(255), p_beginn DATETIME)
BEGIN
INSERT INTO Vorstellung (Beginn, fk_Film_ID, fk_Saal_ID) VALUES (p_beginn, film_pub_search_film(p_filmname), saal_pub_search_saal(p_saalname));
END$$
DELIMITER ;

View File

@@ -0,0 +1,86 @@
DELIMITER $$
-- Reservierung-Package
DROP FUNCTION IF EXISTS res_priv_search_vorstellung$$
CREATE FUNCTION res_priv_search_vorstellung (p_saalname VARCHAR(50), p_beginn DATETIME)
RETURNS INTEGER UNSIGNED
BEGIN
DECLARE res INTEGER UNSIGNED;
DECLARE EXIT HANDLER FOR 1172 BEGIN
SIGNAL SQLSTATE '50200' SET MESSAGE_TEXT = 'Mehr als eine Vorstellung gefunden!';
END;
SELECT Vorstellung.ID INTO res FROM Vorstellung WHERE Vorstellung.fk_Saal_ID=saal_pub_search_saal(p_saalname) AND Vorstellung.Beginn=p_beginn;
IF res IS NULL THEN
SIGNAL SQLSTATE '50201' SET MESSAGE_TEXT = 'Keine Vorstellung gefunden!';
END IF;
RETURN res;
END $$
DROP FUNCTION IF EXISTS res_pub_chk_mail$$
CREATE FUNCTION res_pub_chk_mail(p_mail VARCHAR(255))
RETURNS BIT
BEGIN
if EXISTS(select 1 from (SELECT p_mail Mail) t where t.Mail REGEXP '^[a-zA-Z0-9][a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,4}$')
then
return 1;
else
return 0;
end if;
END $$
DROP FUNCTION IF EXISTS `res_pub_reservieren`$$
CREATE FUNCTION `res_pub_reservieren` (
p_vorstellung_saalname VARCHAR(50),
p_vorstellung_beginn DATETIME,
p_vorname VARCHAR(255),
p_nachname VARCHAR(255),
p_mail VARCHAR(255),
p_reihe INTEGER UNSIGNED,
p_platz INTEGER UNSIGNED
)
RETURNS INTEGER UNSIGNED
BEGIN
DECLARE v_reservierungID INTEGER UNSIGNED DEFAULT NULL;
INSERT INTO Reservierung (Vorname, Nachname, Mail, fk_Vorstellung_ID) VALUES
(p_vorname, p_nachname, p_mail, res_priv_search_vorstellung(p_vorstellung_saalname, p_vorstellung_beginn))
;
SET v_reservierungID = LAST_INSERT_ID();
INSERT INTO nm_Reservierung_Sitzplatz (fk_Reservierung_ID, fk_Sitzplatz_ID) VALUES
(v_reservierungID, saal_pub_search_sitzplatz(p_vorstellung_saalname, p_reihe, p_platz))
;
RETURN v_reservierungID;
END $$
DROP PROCEDURE IF EXISTS `res_pub_add_reservieren_sitz`$$
CREATE PROCEDURE `res_pub_add_reservieren_sitz` (
p_reservierungID INTEGER UNSIGNED,
p_reihe INTEGER UNSIGNED,
p_platz INTEGER UNSIGNED
)
BEGIN
DECLARE v_saalID INTEGER UNSIGNED DEFAULT 0;
IF (p_reservierungID IS NULL) THEN
SIGNAL SQLSTATE '50210' SET MESSAGE_TEXT = 'Reservierungs-ID darf nicht NULL sein!';
END IF;
SELECT Vorstellung.fk_Saal_ID INTO v_saalID FROM Reservierung
JOIN Vorstellung ON Reservierung.fk_Vorstellung_ID = Vorstellung.ID
WHERE Reservierung.ID=p_reservierungID
;
INSERT INTO nm_Reservierung_Sitzplatz (fk_Reservierung_ID, fk_Sitzplatz_ID) VALUES
(p_reservierungID, saal_pub_search_sitzplatz_saalID(v_saalID, p_reihe, p_platz))
;
END $$
DELIMITER ;

141
08-insert.sql Normal file
View File

@@ -0,0 +1,141 @@
-- Tabellen leeren
DELETE FROM Reservierung;
ALTER TABLE Reservierung AUTO_INCREMENT = 1;
DELETE FROM Vorstellung;
ALTER TABLE Vorstellung AUTO_INCREMENT = 1;
DELETE FROM Saal;
ALTER TABLE Saal AUTO_INCREMENT = 1;
DELETE FROM Film;
ALTER TABLE Film AUTO_INCREMENT = 1;
DELETE FROM Schauspieler;
ALTER TABLE Schauspieler AUTO_INCREMENT = 1;
-- doneTODO Auskommentieren
-- DELETE FROM Sitzplatz; -- wird mit den Sälen gelöscht (CASCADE)
-- ALTER TABLE Sitzplatz AUTO_INCREMENT = 1;
-- DELETE FROM nm_Reservierung_Sitzplatz; -- wird mit Reservierungen oder Sitzplätzen gelöscht (CASCADE)
-- ALTER TABLE nm_Reservierung_Sitzplatz AUTO_INCREMENT = 1;
-- DELETE FROM nm_Film_Schauspieler; -- wird mit Film oder Schauspieler gelöscht (CASCADE)
-- ALTER TABLE nm_Film_Schauspieler AUTO_INCREMENT = 1;
-- Auskommentieren Ende
-- Säle und Sitzplätze hinzufügen
CALL saal_pub_add_saal('Kino 1', 'Saal für Premieren', 50, 35, 10);
CALL saal_pub_update_preis('Kino 1', 26, 50, 1, 35, 13); -- Hintere Logen-Plätze sind teurer
CALL saal_pub_add_saal3('Kino 2');
CALL saal_pub_update_preis('Kino 2', 1, 20, 1, 20, 5); -- Saal-Größe auf 20x20 vergrößern
CALL saal_pub_update_preis('Kino 2', 11, 20, 1, 20, 7); -- Hintere Logen-Plätze sind teurer
CALL saal_pub_add_saal2('Kino 3', 'Viel zu kleiner Saal');
CALL saal_pub_update_preis('Kino 3', 1, 10, 1, 20, 5); -- Saal ist nicht rechteckig, erste 10 Reihen haben 20 Plätze
CALL saal_pub_update_preis('Kino 3', 11, 20, 1, 10, 7); -- Hintere Logen-Plätze sind teurer
CALL saal_pub_add_saal2('Club A', 'Im Bibliothek-Stil');
CALL saal_pub_update_preis('Club A', 1, 12, 1, 5, 15); -- Kleiner Luxus-Saal
CALL saal_pub_add_saal1('Club B', 12, 5, 5); -- Gemütlicher Saal für kleine Anlässe
-- Schauspieler
INSERT IGNORE INTO Schauspieler (Vorname, Nachname, Geburtstag) VALUES
('Brett', 'Fit', STR_TO_DATE('1.3.1937', '%e.%c.%Y')),
('Angela', 'Jolly', STR_TO_DATE('5.4.1965', '%e.%c.%Y')),
('Julia', 'Roberto', STR_TO_DATE('5.7.1971', '%e.%c.%Y')),
('Arnold', 'Altenpfleger', STR_TO_DATE('1.7.1974', '%e.%c.%Y')),
('Dwayne', 'Johnson', STR_TO_DATE('28.2.1957', '%e.%c.%Y')),
('Alan', 'Schickman', STR_TO_DATE('30.4.1910', '%e.%c.%Y')),
('Robert', 'De Menz', STR_TO_DATE('19.12.1943', '%e.%c.%Y'))
;
-- Filme
INSERT IGNORE INTO Film (Name, Bewertung, Spieldauer, Beschreibung) VALUES
('Alan und die Wundertüte', 4.5, 150, 'Alan ist auf der Reise in ein verstecktes Land. auf dem Weg trifft er einen Zauberer, der ihm ein grünes Pulver verkauft. Nachdem er es anzündete und einatmete, geschah das unverhoffte Wunder!'),
('Zweilight', 1.2, 127, 'In einem dunklen lauern zwilichtichtige Gestalten, die als Vampire verkleidet ahnungslose Passanten pranken wollen. Großer genugtuender Gruselspaß!'),
('Asterisk und Klammeraffe', 3.4, 186, 'In einer neuen Auflage des Klassikers versucen die beiden Protagonisten den Kaiser Julius Hashtag zu überlisten. Dafür haben sie wieder viele neue Pläne geschmiedet!'),
('Tarkan, der Herr des Dschüngels', 5.0, 134, 'Ab Dönerstag im Kino')
;
INSERT IGNORE INTO Film (Name, Bewertung, Spieldauer) VALUES
('Mitten im Heben', 4.6, 92),
('Alarm für Python 12', 2.9, 102)
;
-- Schauspieler-Film-Beziehungen
CALL film_pub_add_schauspieler_film('Brett', 'Fit', 'Zweilight');
CALL film_pub_add_schauspieler_film('Angela', 'Jolly', 'Zweilight');
CALL film_pub_add_schauspieler_film('Robert', 'De Menz', 'Zweilight');
CALL film_pub_add_schauspieler_film('Julia', 'Roberto', 'Alan und die Wundertüte');
CALL film_pub_add_schauspieler_film('Angela', 'Jolly', 'Alan und die Wundertüte');
CALL film_pub_add_schauspieler_film('Alan', 'Schickman', 'Alan und die Wundertüte');
CALL film_pub_add_schauspieler_film('Robert', 'De Menz', 'Asterisk und Klammeraffe');
CALL film_pub_add_schauspieler_film('Alan', 'Schickman', 'Mitten im Heben');
CALL film_pub_add_schauspieler_film('Brett', 'Fit', 'Mitten im Heben');
CALL film_pub_add_schauspieler_film('Robert', 'De Menz', 'Mitten im Heben');
CALL film_pub_add_schauspieler_film('Julia', 'Roberto', 'Mitten im Heben');
CALL film_pub_add_schauspieler_film('Julia', 'Roberto', 'Alarm für Python 12');
CALL film_pub_add_schauspieler_film('Alan', 'Schickman', 'Alarm für Python 12');
-- Vorstellungen
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 11:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 15:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 18:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 12:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('2.5.2017 16:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 11:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 15:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 18:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 12:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('3.5.2017 16:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 11:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 15:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 18:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 12:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('4.5.2017 16:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 11:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 15:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 18:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 12:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('5.5.2017 16:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 11:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 15:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 18:15', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 12:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Tarkan, der Herr des Dschüngels', STR_TO_DATE('6.5.2017 16:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('2.5.2017 21:10', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('3.5.2017 21:10', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('4.5.2017 21:10', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Alan und die Wundertüte', STR_TO_DATE('5.5.2017 20:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 2', 'Alan und die Wundertüte', STR_TO_DATE('6.5.2017 20:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club A', 'Mitten im Heben', STR_TO_DATE('2.5.2017 13:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club B', 'Mitten im Heben', STR_TO_DATE('3.5.2017 14:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club A', 'Mitten im Heben', STR_TO_DATE('4.5.2017 13:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club B', 'Mitten im Heben', STR_TO_DATE('5.5.2017 14:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club A', 'Mitten im Heben', STR_TO_DATE('6.5.2017 13:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('2.5.2017 18:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('2.5.2017 22:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club A', 'Zweilight', STR_TO_DATE('3.5.2017 12:45', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('3.5.2017 22:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('4.5.2017 18:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('4.5.2017 22:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Club A', 'Zweilight', STR_TO_DATE('5.5.2017 12:45', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('5.5.2017 22:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 3', 'Zweilight', STR_TO_DATE('6.5.2017 18:00', '%e.%c.%Y %H:%i'));
CALL vrst_pub_add_vorstellung('Kino 1', 'Zweilight', STR_TO_DATE('6.5.2017 22:00', '%e.%c.%Y %H:%i'));

7060
09-insert-reservierungen.sql Normal file

File diff suppressed because it is too large Load Diff

37
10-testcases.sql Normal file
View File

@@ -0,0 +1,37 @@
-- -- Eine Sitz in einer Vorstellung mehrfach reservieren
-- -- Eine Vorstellung über add_vorstellung mit ungültigem Saal oder Film
-- -- Eine Beziehung über add_schauspieler_film mit ungültigem Schauspieler oder Film
-- -- Einen Saal über add_saal mit ungültigem Kino
-- -- Einen Sitz über reservieren oder add_reservieren_sitz mit ungültiger Position hinzufügen
-- -- Keine Schauspieler-Geburtstage vor 1900 und nach 2100
INSERT INTO Schauspieler (Vorname, Nachname, Geburtstag) VALUES ('Nicht', 'So', STR_TO_DATE('1.3.2237', '%e.%c.%Y'));
INSERT INTO Schauspieler (Vorname, Nachname, Geburtstag) VALUES ('So', 'Auch-Nicht', STR_TO_DATE('1.3.1837', '%e.%c.%Y'));
-- -- Mit einer ungültigen Mail-Adresse reservieren
SET @resID1 := reservieren('Kino 1', STR_TO_DATE('6.5.2017 22:00', '%e.%c.%Y %H:%i'), 'Peter', 'Ustinov', '@gmx.de', 10, 10);
-- -- Keine Preise über 100 Euro für einen Sitz
CALL update_preis('Kino 1', 50, 50, 1, 35, 130);
CALL update_preis('Kino 1', 50, 50, 1, 35, 100.5);
-- -- Überlappende Vorstellungen
CALL add_vorstellung('Kino 1', 'Alan und die Wundertüte', STR_TO_DATE('2.5.2017 21:20', '%e.%c.%Y %H:%i'));
UPDATE Film SET Spieldauer=200 WHERE Name='Tarkan, der Herr des Dschüngels';
UPDATE Vorstellung
SET Beginn = STR_TO_DATE('2.5.2017 14:20', '%e.%c.%Y %H:%i')
WHERE ID = 26; -- 2.5.2017 21:10 in Kino 1
-- -- Registrierungen loggen
-- Schon belegt wird aufgrund der Beschränkungen von MysQL nicht geloggt (kein PRAGMA AUTONOMOUS_TRANSACTION)
SET @resID_test := reservieren('Kino 3', STR_TO_DATE('6.5.2017 18:00', '%e.%c.%Y %H:%i'), 'Mark', 'Müller', 'mueller17@gmail.com', 5, 8);
CALL add_reservieren_sitz(@resID_test, 5, 9);
CALL add_reservieren_sitz(@resID_test, 5, 10);