Corrigé Exercice Oracle SQLPLUS miniprojet - Gestion d’une compétition sportive

- 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;
.
/

Article plus récent Article plus ancien

Leave a Reply