1)
CREATE TABLE Coureurs (
id_coureur NUMBER PRIMARY KEY,
nom VARCHAR2(50),
prenom VARCHAR2(50),
equipe VARCHAR2(50)
);
2)
CREATE TABLE Points_controle (
id_coureur NUMBER,
id_point NUMBER,
temps NUMBER(6,2),
CONSTRAINT fk_coureur FOREIGN KEY (id_coureur) REFERENCES Coureurs(id_coureur)
);
3)
CREATE OR REPLACE PROCEDURE Ajouter_temps(
id_coureur IN NUMBER,
id_point IN NUMBER,
temps IN NUMBER
) IS
BEGIN
INSERT INTO Points_controle (id_coureur, id_point, temps)
VALUES (id_coureur, id_point, temps);
END;
4)
CREATE OR REPLACE FUNCTION Temps_total(
id_coureur IN NUMBER
) RETURN NUMBER IS
total_temps NUMBER(6,2) := 0;
BEGIN
SELECT SUM(temps) INTO total_temps
FROM Points_controle
WHERE id_coureur = id_coureur;
RETURN total_temps;
END;
5)
CREATE OR REPLACE TRIGGER Verif_temps
BEFORE INSERT ON Points_controle
FOR EACH ROW
DECLARE
last_temps NUMBER(6,2);
BEGIN
SELECT temps INTO last_temps
FROM Points_controle
WHERE id_coureur = :new.id_coureur AND id_point = :new.id_point - 1;
IF last_temps > :new.temps THEN
RAISE_APPLICATION_ERROR(-20001, 'Le temps de passage doit être supérieur au temps précédent');
END IF;
END;
6)
CREATE OR REPLACE TRIGGER Maj_temps_total
AFTER INSERT ON Points_controle
FOR EACH ROW
BEGIN
UPDATE Coureurs
SET temps_total = (SELECT SUM(temps) FROM Points_controle WHERE id_coureur = :new.id_coureur)
WHERE id_coureur = :new.id_coureur;
END;
Ce trigger met à jour le temps total de course d'un coureur à chaque nouveau point de contrôle. Il calcule la somme des temps de passage du coureur à tous les points de contrôle, puis met à jour la colonne "temps_total" de la table "Coureurs" pour le coureur concerné. Notez que la colonne "temps_total" doit être ajoutée à la table "Coureurs" pour que ce trigger fonctionne :
ALTER TABLE Coureurs ADD temps_total NUMBER(6,2);