Vous êtes sur la page 1sur 9

Correction du CC1

Partie 1 :
Soit le dictionnaire (U) de donnes suivants :

ID : identifiant du joueur

Nom : nom du joueur

Prenom : prnom du joueur

Code : code du jeu

Auteur : auteur du jeu

Score_R : score reli dan un jeu par un joueur donn

Niveau : niveau atteint dans un jeu par un joueur

Dure : dure dun jeu par un joueur donn

Date : date de joueur dun jeu par un joueur donn

Heure : heure dbut dun jeu par un joueur donn

Nombre : nombre de fois quun joueur a jou avec un jeu donn

Score_M : score maximal dun joueur dans un jeu

LES DF :

ID NOM

ID PRENOM

CODE AUTEUR

ID+CODE SCORE_M

ID+CODE NOMBRE

ID+CODE+DATE+HEURESCORE_M

Id+code+date+heure DUREE
Solution :
Q1.
Oui
Oui
Oui
Non

Q3.
{ID, Code}+= {ID,Code}U{Nom}U{prenom}U{Auteur}U{secor_Max}U{Nombre}

{ID, Code,Date,Heure}+=U

Q4- La cl est {ID, Code,Date,Heure} , elle est unique car elle est fournie de la base.

Q5. Non, il n est pas en 3FN car elle nest pas en 2NF car une partie de la cl a une dpendance
fonctionnelle directe avec un attribu hors de la cl.
Q6. Dcomposition
R1(Id, Nom, Prenom,)
R2(code,auteur)
R3(id,code,score_max)
R4(id,code,date,heure,score_R,Niveau)

Partie 2 :
Joueurs (id joueur, nom joueur, prnom joueur, ge, niveau)

Jeux (code jeu, prix jeu, auteur, Date apparition, nbr telech)

Rencontres (code jeu, id 1ere joueur, id 2eme joueur, score 2eme joueur, date jeu, heure dbut, heure
fin, dure, score 2eme joueur)

Q1 : Donner une requte SQL pour la cration de table Rencontres

Q2 : Ecrire une procdure stocke qui permet de calculer et afficher le nombre de jeux distinct gagn
par un joueur donn. Afficher un message derreur si le jeu nexiste pas

Q3 : Ecrire une requte SQL qui permet dajouter 6 colonnes dans la table Joueurs suivantes : le nbr de
jeux gagns, le nbr de jeux perdus, le nombre total des adversaires, le nbr distinct des adversaires, le
score total et le niveau du joueur (le score total est la somme de la dfrence entre les scores du
joueur en question et les scores de ces adversaires dans chaque match) puis, Ecrire une procdure
PL/SQL qui permet de mettre a jour le table Joueurs pour les colonnes ajoutes tel que le champ
Niveau du joueur vaut :
Non qualifi si le nbr des adversaires distinct infrieur a 100

Expert si le score total dpasse 100

Moyen si le score total entre 500 et 1000

Dbutant si le score tala infrieur a 500

Q4 : Ecrire un trigger qui permet dassurer les contraintes et les traitements suivants lors de linsertion
dun tuple dans la table Rencontres

Lunicit de la cl

Lexistence des 2 joueurs et ils sont diffrents

Lexistence du jeu

Annuler toute linsertion si et lheure dbut suprieure a lheure fin lheure dbut

Calculer la colonne dure de jeu

Q5 : Ecrire un trigger qui permet de mettre a jour les 6 colonnes ajoutes dans la question Q3 lors de
linsertion dun tuple dans la table Rencontres

Q6 : On suppose que nous avons ajout une seule colonne dans la table Joueurs qui stock le nbr des
adversaires pour chaque joueur. Ecrire un trigger qui permet de mettre a jour la table joueurs lors de
la modification ou la suppression dans la table Rencontres

Solution :
Q1 :

CREATE table "JOUEURS" (

"ID_JOUEUR" VARCHAR2(10) NOT NULL,

"NOM_JOUEUR" VARCHAR2(10),

"PRENOM_JOUEUR" VARCHAR2(10),

"AGE_JOUEUR" NUMBER(10),

constraint "JOUEURS_PK" primary key ("ID_JOUEUR")

/
CREATE sequence "JOUEURS_SEQ"

CREATE trigger "BI_JOUEURS"

before insert on "JOUEURS"

for each row

begin

if :NEW."ID_JOUEUR" is null then

select "JOUEURS_SEQ".nextval into :NEW."ID_JOUEUR" from dual;

end if;

end;

Creation de la table Jeux:

CREATE table "JEUX" (

"CODE_JEU" VARCHAR2(20) NOT NULL,

"PRIX_JEU" VARCHAR2(20),

"AUTEUR" VARCHAR2(20),

"DATE_APPARITION" DATE,

"NOMBRE_TELECHARGEMENTS" NUMBER(20),

constraint "JEUX_PK" primary key ("CODE_JEU")

CREATE sequence "JEUX_SEQ"


/

CREATE trigger "BI_JEUX"

before insert on "JEUX"

for each row

begin

if :NEW."CODE_JEU" is null then

select "JEUX_SEQ".nextval into :NEW."CODE_JEU" from dual;

end if;

end;

Creation de Rencontres:

CREATE TABLE "RENCONTRES"


( "CODE_JEU" VARCHAR2(20),
"ID_JOUEUR1" VARCHAR2(20),
"ID_JOUEUR2" VARCHAR2(20),
"DATE_JEU" DATE,
"HEURE_DEBUT" TIMESTAMP (4),
"HEURE_FIN" TIMESTAMP (4),
"DUREE_JEU" TIMESTAMP (4),
"SCORE_JOUEUR1" NUMBER(20,0),
"SCORE_JOUEUR2" NUMBER(20,0),
CONSTRAINT "RENCONTRES_PK" PRIMARY KEY ("CODE_JEU", "ID_JOUEUR1") ENABLE
) ;ALTER TABLE "RENCONTRES" ADD CONSTRAINT "RENCONTRES_FK" FOREIGN KEY ("ID_JOUEUR1")
REFERENCES "JOUEURS" ("ID_JOUEUR") ENABLE;ALTER TABLE "RENCONTRES" ADD
CONSTRAINT "RENCONTRES_FK2" FOREIGN KEY ("CODE_JEU")
REFERENCES "JEUX" ("CODE_JEU") ENABLE;ALTER TABLE "RENCONTRES" ADD CONSTRAINT
"RENCONTRES_FK3" FOREIGN KEY ("ID_JOUEUR2")
REFERENCES "JOUEURS" ("ID_JOUEUR") ENABLE;
N.B : Rencontres est la relation entre les deux tables jeux et joueurs .
Q2 :_

create or replace procedure "CALCULE"


(id_joueur IN VARCHAR2)
is
nbr1 integer;
nbr2 integer;
tab integer;
ma_exp Exception;
begin
select count(*) INTO tab from joueurs;
if tab != 0
then
select count (distinct code_jeu) INTO nbr1
FROM Rencontres
where (id_joueur=id_joueur1 and score_joueur1>score_joueur2);
select count (distinct code_jeu) INTO nbr2
from rencontres
where (id_joueur=id_joueur2 and (score_joueur2 > score_joueur1));
dbms_output.put_line('le nombre de jeux gagns est', || nbr1+nbr2 );
else
raise ma_exp;
end if;
exception
when ma_exp then
dbms_output.put_line(' il n esxiste pas de jeux dans la table jeux');
end;

Q4 :

create or replace trigger "RENCONTRES_T2"


BEFORE
insert on "RENCONTRES"
for each row
DECLARE nbr INTEGER;
begin
IF ( :new."SCORE1"> :new."SCORE2" )THEN
Update joueurs
set NBR_GAGNE = NBR_GAGNE+1
where ID = :new."ID1";
update joueurs
set NBR_PERDUE = NBR_PERDUE+1
where ID = :new."ID2";
ELSE
Update joueurs
set NBR_GAGNE = NBR_GAGNE+1
where ID = :new."ID2";
update joueurs
set NBR_PERDUE = NBR_PERDUE+1
where ID = :new."ID1";
END IF;
update joueurs
Set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID=:new."ID2" ;
update joueurs
Set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID=:new."ID1" ;

Select count (ID2) into nbr from rencontres where ID1=:new."ID1";


IF nbr=0 THEN
update joueurs
Set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID =:new."ID1";
end if;

Q5-

create or replace trigger "RENCONTRES_T2"


BEFORE
insert on "RENCONTRES"
for each row
DECLARE nbr INTEGER;
begin
IF ( :new."SCORE1"> :new."SCORE2" )THEN
Update joueurs
set NBR_GAGNE = NBR_GAGNE+1
where ID = :new."ID1";
update joueurs
set NBR_PERDUE = NBR_PERDUE+1
where ID = :new."ID2";
ELSE
Update joueurs
set NBR_GAGNE = NBR_GAGNE+1
where ID = :new."ID2";
update joueurs
set NBR_PERDUE = NBR_PERDUE+1
where ID = :new."ID1";
END IF;
update joueurs
Set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID=:new."ID2" ;
update joueurs
Set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID=:new."ID1" ;

Select count (ID2) into nbr from rencontres where ID1=:new."ID1";


IF nbr=0 THEN
update joueurs
Set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID =:new."ID1";
end if;
end;

Q6:

create or replace trigger "RENCONTRES_T3"


AFTER
update or delete on "RENCONTRES"
for each row
begin
IF updating then
update joueurs
set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID =:NEW."ID1";
update joueurs
set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID =:NEW."ID2";
end if;
if deleting then
update joueurs
set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID =:new."ID1";
update joueurs
set NBR_ADVERSAIRE = NBR_ADVERSAIRE+1
where ID =:new."ID2";
end if;
end;