-- Views und Trigger
-- SQL Tabellen

-- Tabelle Pilot

CREATE TABLE pilot (
personalnr INTEGER PRIMARY KEY,
name VARCHAR NOT NULL,
alter INTEGER,
flugstunden NUMERIC
);

-- Tabelle Flugszeugtype

CREATE TABLE flugzeugtyp (
typbezeichnung VARCHAR PRIMARY KEY,
reisegeschwindigkeit NUMERIC,
typflugstunden NUMERIC
);

-- Tabelle Fliegt

CREATE TABLE fliegt (
personalnr INTEGER REFERENCES pilot(personalnr),
typbezeichnung VARCHAR REFERENCES flugzeugtyp(typbezeichnung),
fliegtflugstunden NUMERIC,
PRIMARY KEY(personalnr, typbezeichnung)
);

-- Befüllen der Tabellen pilot und flugzeugtyp

INSERT INTO pilot (personalnr, name, alter, flugstunden) VALUES (1007, 'James', 44, 20012);
INSERT INTO pilot (personalnr, name, alter, flugstunden) VALUES (1008, 'Zoe', 33, 10020);
INSERT INTO pilot (personalnr, name, alter, flugstunden) VALUES (1009, 'Walther', 27, 5020);

INSERT INTO flugzeugtyp (typbezeichnung, reisegeschwindigkeit, typflugstunden) VALUES ('Airbus A320', 800, 50821);
INSERT INTO flugzeugtyp (typbezeichnung, reisegeschwindigkeit, typflugstunden) VALUES ('Airbus A370', 800, 20312);
INSERT INTO flugzeugtyp (typbezeichnung, reisegeschwindigkeit, typflugstunden) VALUES ('Boing B737', 800, 30021);

-- View

CREATE VIEW pflugstunden AS
SELECT personalnr, name , SUM (flugstunden)
FROM pilot
GROUP BY personalnr, name;

CREATE VIEW typflugstunden AS
SELECT typbezeichnung, SUM (typflugstunden)
FROM flugzeugtyp
GROUP BY typbezeichnung;

SELECT *
FROM pflugstunden;

-- Trigger

CREATE OR REPLACE FUNCTION AktualisiereFlugstunden ( ) RETURNS TRIGGER AS
'
BEGIN
-- aktualisiere die Flugstunden des Piloten

UPDATE pilot SET flugstunden = flugstunden + NEW.fliegtflugstunden WHERE personalnr = NEW.personalnr;

-- aktualisiere die Flugstunden des Flugzeugtyps

UPDATE flugzeugtyp SET typflugstunden = typflugstunden + NEW.fliegtflugstunden WHERE typbezeichnung = NEW.typbezeichnung;

RETURN NEW;

END;
' LANGUAGE 'plpgsql';

CREATE TRIGGER pflugstunden
AFTER INSERT ON fliegt
FOR EACH ROW EXECUTE PROCEDURE AktualisiereFlugstunden ( );


INSERT INTO fliegt (personalnr, typbezeichnung, fliegtflugstunden) VALUES (1007, 'Airbus A320', 10000);
INSERT INTO fliegt (personalnr, typbezeichnung, fliegtflugstunden) VALUES (1008, 'Airbus A320', 1000);

SELECT *
FROM pflugstunden;