- Consulter la page de l'exercice.
- Solution de l'exercice.
Correction
-- Creation de la base de donnees source
create table concurrent (numero number(1) primary key, nom char(1));
insert into concurrent values (1, 'A');
insert into concurrent values (2, 'B');
insert into concurrent values (3, 'C');
insert into concurrent values (4, 'D');
insert into concurrent values (5, 'E');
insert into concurrent values (6, 'F');
insert into concurrent values (7, 'G');
insert into concurrent values (8, 'H');
insert into concurrent values (9, 'I');
insert into concurrent values (0, 'J');
create table resultat (numero_conc number(1) primary key, temps number(4,2));
insert into resultat values (1, 3.25);
insert into resultat values (2, 3.15);
insert into resultat values (3, NULL);
insert into resultat values (4, 3.16);
insert into resultat values (5, 3.14);
insert into resultat values (6, 3.15);
insert into resultat values (7, 3.09);
insert into resultat values (8, 3.10);
insert into resultat values (9, 3.10);
insert into resultat values (0, 3.19);
-- Remplissage de la table classement (bloc PL/SQL)
DECLARE
-- Meilleur temps
best resultat.temps%TYPE;
-- Liste des concurrents classes par temps croissant (du meilleur au moins bon)
-- On ignore les concurrents ayant abandonne
cursor liste is
select nom, temps from concurrent, resultat
where numero=numero_conc
and temps is not null
order by temps;
c liste%ROWTYPE;
-- Ecart au 1er
ecart resultat.temps%TYPE;
-- Indice de rang rg integer:=0;
-- Temps du concurrent precedent
temps_prec resultat.temps%TYPE:=-1;
BEGIN
-- Nettoyage de la table classement delete from classement;
-- Sauvegarde du meilleur temps
select min(temps) into best from resultat;
-- Parcours de la liste des concurrents et remplissage de la table classement
for c in liste loop
-- Calcul de l'ecart avec le meilleur temps
ecart:=c.temps-best;
-- Si le temps du concurrent courant est different
-- du temps du concurrent precedent
if c.temps>temps_prec then
-- Concurrent courant moins bien classe, le rang augmente de 1
rg:=rg+1;
insert into classement values (rg, c.nom, ecart);
else
-- Meme classement que le concurrent precedent, le rang n’augmente pas
insert into classement values (NULL, c.nom, ecart);
end if;
-- Mise a jour du temps du concurrent precedent (= temps courant)
temps_prec:=c.temps;
end loop;
END;
.
/
Aucun commentaire:
Enregistrer un commentaire