Voici une autre série d'Exercices Corrigés .
Allons travailler un peu d'exercices de Procédures Stockées , de Fonctions et de Triggers .
Ecercice :
go
use Agence
go
create table Station
(
nomStation varchar(25) primary key,
capacité int,
lieu varchar(25),
region varchar(25),
tarif float
)
create table Client
(
ID int primary key,
nom varchar(25),
prenom varchar(25),
ville varchar(25),
region varchar(25),
solde float
)
create table Activite
(
nomStation varchar(25) foreign key references Station(nomStation),
libelle varchar(25),
primary key(nomStation,libelle),
prix float
)
create table Sejour
(
idClient int foreign key references Client(ID),
station varchar(25) foreign key references Station(nomStation),
debut date,
primary key(idClient,station,debut),
nbPlaces int
)
insert into Station values('Venus',350,'Guadeloupe','Antilles',1200)
insert into Client values(10,'Gogg','Philipes','Londres','Europe',1246.5)
insert into Client values(20,'Pascal','Blais','Paris','Europe',6763)
insert into Client values(30,'Kerouac','Jack','New York','Amérique',9812)
insert into Activite values('Venus','Voiles',150)
insert into Activite values('Venus','Plongee',120)
insert into Sejour values(20,'Venus','03/08/2003',4)
select * from Station
select * from Client
select * from Activite
select * from Sejour
/*1*/
create proc p1(@idClient int)
as
declare @nomC varchar(100)
select @nomC=nom+' '+prenom from Client
print @nomC
Ou
/*1*/
create proc NomClient(@id int)
as
declare @nom varchar(25),@prenom varchar(25)
declare curseur CURSOR for select nom,prenom from Client where ID=@id
open curseur
fetch curseur into @nom,@prenom
while(@@FETCH_STATUS=0)
begin
print @nom+' '+@prenom
fetch curseur into @nom,@prenom
end
close curseur
deallocate curseur
/*2*/
Create function Activities(@nomStation varchar(25))
Returns varchar(8000)
as
begin
declare @i int
set @i=0
declare @chaine varchar(8000)
set @chaine=''
declare @libelle varchar(25)
declare curseur CURSOR for select libelle from Activite where nomStation=@nomStation
open curseur
fetch curseur into @libelle
while(@@FETCH_STATUS=0)
begin
if(@i!=0)
set @chaine+=','
set @chaine+=@libelle
set @i+=1
fetch curseur into @chaine
end
close curseur
deallocate curseur
return @chaine
end
/*3*/
create view v1
as
select *,dbo.Activities(nomStation)as 'Activies' from Station
/*4*/
Create proc Actualiser(@pourcentage int,@nomStation varchar(25))
as
if(@pourcentage<0 or @pourcentage>100)
print 'Pourcentage invalide!'
else
begin
update Station set tarif+=(tarif*(@pourcentage*0.01)) where nomStation=@nomStation
update Activite set prix+=(prix*(@pourcentage*0.01)) where nomStation=@nomStation
print 'Modifié'
end
/*5*/
create trigger t2
on activite
after update
as
declare @dif float
select @dif=d.prix-i.prix from inserted i,deleted d
update Station set tarif+=@dif
/*6*/
/*(a)*/
create table Station
add nbrActivities int not null default 0
/*(b)*/
create trigger t2
on Station
for insert,update,delete
as
declare @nbrActivites int
declare @nomStation varchar(25)
declare curseur CURSOR for select nomStation from Station
open curseur
fetch curseur into @nomStation
while(@@FETCH_STATUS=0)
begin
update Station set nbrActivities=(select count(*) from Activite where nomStation=@nomStation) where nomStation=@nomStation
fetch curseur into @nomStation
end
close curseur
deallocate curseur
/*7*/
create trigger t3
on Sejour
after insert
as
declare @Solde float
declare @NbPlaces int
declare @Tarif float
select @Solde=solde from Client c,Inserted i where i.idClient=c.id
select @NbPlaces=Nbplaces from inserted
select @Tarif=tarif from Station where NomStation in(select NomStation from Inserted)
print @Solde
print @Nbplaces
print @tarif
if((@Tarif*@NbPlaces)>@Solde)
begin
print 'Opération échoué : Solde inférieur à (tarif*NbPlaces)'
rollback transaction
end
Allons travailler un peu d'exercices de Procédures Stockées , de Fonctions et de Triggers .
Ecercice :
Correction :
/*La création*/
create database Agencego
use Agence
go
create table Station
(
nomStation varchar(25) primary key,
capacité int,
lieu varchar(25),
region varchar(25),
tarif float
)
create table Client
(
ID int primary key,
nom varchar(25),
prenom varchar(25),
ville varchar(25),
region varchar(25),
solde float
)
create table Activite
(
nomStation varchar(25) foreign key references Station(nomStation),
libelle varchar(25),
primary key(nomStation,libelle),
prix float
)
create table Sejour
(
idClient int foreign key references Client(ID),
station varchar(25) foreign key references Station(nomStation),
debut date,
primary key(idClient,station,debut),
nbPlaces int
)
insert into Station values('Venus',350,'Guadeloupe','Antilles',1200)
insert into Client values(10,'Gogg','Philipes','Londres','Europe',1246.5)
insert into Client values(20,'Pascal','Blais','Paris','Europe',6763)
insert into Client values(30,'Kerouac','Jack','New York','Amérique',9812)
insert into Activite values('Venus','Voiles',150)
insert into Activite values('Venus','Plongee',120)
insert into Sejour values(20,'Venus','03/08/2003',4)
select * from Station
select * from Client
select * from Activite
select * from Sejour
/*1*/
create proc p1(@idClient int)
as
declare @nomC varchar(100)
select @nomC=nom+' '+prenom from Client
print @nomC
Ou
/*1*/
create proc NomClient(@id int)
as
declare @nom varchar(25),@prenom varchar(25)
declare curseur CURSOR for select nom,prenom from Client where ID=@id
open curseur
fetch curseur into @nom,@prenom
while(@@FETCH_STATUS=0)
begin
print @nom+' '+@prenom
fetch curseur into @nom,@prenom
end
close curseur
deallocate curseur
/*2*/
Create function Activities(@nomStation varchar(25))
Returns varchar(8000)
as
begin
declare @i int
set @i=0
declare @chaine varchar(8000)
set @chaine=''
declare @libelle varchar(25)
declare curseur CURSOR for select libelle from Activite where nomStation=@nomStation
open curseur
fetch curseur into @libelle
while(@@FETCH_STATUS=0)
begin
if(@i!=0)
set @chaine+=','
set @chaine+=@libelle
set @i+=1
fetch curseur into @chaine
end
close curseur
deallocate curseur
return @chaine
end
/*3*/
create view v1
as
select *,dbo.Activities(nomStation)as 'Activies' from Station
/*4*/
Create proc Actualiser(@pourcentage int,@nomStation varchar(25))
as
if(@pourcentage<0 or @pourcentage>100)
print 'Pourcentage invalide!'
else
begin
update Station set tarif+=(tarif*(@pourcentage*0.01)) where nomStation=@nomStation
update Activite set prix+=(prix*(@pourcentage*0.01)) where nomStation=@nomStation
print 'Modifié'
end
/*5*/
create trigger t2
on activite
after update
as
declare @dif float
select @dif=d.prix-i.prix from inserted i,deleted d
update Station set tarif+=@dif
/*6*/
/*(a)*/
create table Station
add nbrActivities int not null default 0
/*(b)*/
create trigger t2
on Station
for insert,update,delete
as
declare @nbrActivites int
declare @nomStation varchar(25)
declare curseur CURSOR for select nomStation from Station
open curseur
fetch curseur into @nomStation
while(@@FETCH_STATUS=0)
begin
update Station set nbrActivities=(select count(*) from Activite where nomStation=@nomStation) where nomStation=@nomStation
fetch curseur into @nomStation
end
close curseur
deallocate curseur
/*7*/
create trigger t3
on Sejour
after insert
as
declare @Solde float
declare @NbPlaces int
declare @Tarif float
select @Solde=solde from Client c,Inserted i where i.idClient=c.id
select @NbPlaces=Nbplaces from inserted
select @Tarif=tarif from Station where NomStation in(select NomStation from Inserted)
print @Solde
print @Nbplaces
print @tarif
if((@Tarif*@NbPlaces)>@Solde)
begin
print 'Opération échoué : Solde inférieur à (tarif*NbPlaces)'
rollback transaction
end
Thanks a lot Zakaria boukaddouss
RépondreSupprimerMer7ba !
SupprimerLes membres dirigeants d'une association de votre région se servent d'une base de données
RépondreSupprimerpermettant d'organiser la gestion des adhésions des membres (inscription des membres et collectes
des cotisations annuelles) et l'organisation de leurs participations à des congrès.
On propose le modèle suivant :
Membres (numéro_mbr , nom_mbr, date_adhésion_mbr, adresse_mbr )
Congrès (code_cgn, thème_cgn, pays_cgn, durée_cgn, nb_participant_cgn, montant_fixé, montant_total_cotisé)
Participations(#numéro_mbr, #code_cgn, montant_cotise)
Numero_mbr entier
Nom_mbr Chaine variable (50)
Date_adhésion_mbr date
Adress_mbr Chaine variable(100)
Code_cgn Chaine fixe (8)
Theme_cgn Chaine variable(100)
Pays Chaine variable (30)
Nb_participant_cgn Entier
Montant_total_cotisé Nombre
Montant cotisé nombre
Montant_fixé nombre
1. Créer les tables en respectant les contraintes d’intégrité structurelles (3pts)
2. Implémentez les contraintes ci-après : (2 pts)
a. Le montant total pour un congrès est par défaut ‘0’
b. Le nom d’un membre n’est jamais nul
c. Le nombre de participant est par défaut ‘0’
d. Un congrès ne peut avoir lieu que s’il y a au moins un participant
e. Chaque congrès a son thème à lui seul
f. Le montant cotisé par membre participant doit toujours être supérieur au montant fixé par participant pour un congrès
g. Les montants fixés, cotisés, total sont toujours positifs
3. Ecrire un trigger qui à l’ajout d’une nouvelle participation au congrès met à jour le montant_total_cotisé et le nombre de participant (nb_participant_cgn)
4. Ecrire une fonction qui retourne le type de participant (membre) « vip » si le montant cotisé par ce dernier est supérieur à la moyenne des cotisations au cours d’un congrès donnée ou « membre classique» dans le cas contraire
tu veux toute la correction ?
SupprimerOUI BONSOIR. J'ai besoin de la correction svp
Supprimerbsr svp j'ai besoin de la correction aussi
SupprimerBsr svp j'ai aussi besoin de la correction
Supprimerqlq un a la correction svp ?
SupprimerEXERCICE : Modèle relationnel gestion des comptes bancaires (chercheurs)
RépondreSupprimerAgence (code_ag, nom_ag, ville_ag, #mat_emp) ;
Commentaires : Ce matricule ici est le matricule du directeur de l’agence
Employe (mat_emp, nom_emp, date_embauche, numtel_emp, mt_salaire_emp, #code_ag, #code_ag_dir)
Commentaires : code_ag ici c’est l’agence où travaille l’employé, code_ag_dir peut être nul pour tous les employé non dirigeant d’une agence et n’a de valeur que pour l’employé dirigeant
Client (code_cli, nom_cli, numtel_cli)
Operation (num_op, lib_op, date_op, mtt_op, #mat_emp)
Commentaires : mat_emp ici c’est l’employé ayant autorisé l’opération
Compte ( num_cpt, nature_cpt, solde_cpt, avoir_cpt, #code_ag, #mat_emp)
Commentaires : code_ag ici est l’agence où se trouve le compte, matricule ici c’est le propriétaire du compte
Concerner (#num_op, #num_cpt, sens)
Commentaires : un compte peut subir plusieurs opérations donc le sens est 1 si credit et 2 si retrait
Remarque : (tous ces points ne peuvent pas être implémentés par les contraintes d’intégrités, utiliser les contraintes mais si pas possible penser aux triggers, fonctions et procédures)
- La nature du compte peut prendre uniquement les valeurs : compte courant, compte epargne, compte dépôt à terme
- Le libellé de l’opération est soit ‘retrait’ soit ‘crédit’
- L’avoir d’un compte est calculé après chaque opération sur le compte par défaut lors de la création du compte sa valeur est zero (0)
- Le solde du compte peut être positif et dans ce cas prend le signe ‘+’ ou négatif ‘-‘ en fonction de l’avoir du compte (par défaut la valeur est + correspondant à l’avoir compte 0)
- N.B : (pensez à écrire un trigger qui se déclenche après chaque opération sur le compte)
- Le numéro de l’opération est une séquence commençant par 1 avec pas d’incrémentation 1 (N.B : juste une seule séquence pour toutes les agences)
- A la suppression d’une agence toutes les lignes d’affiliations dans cette agence doivent être supprimées, mais code_ag dans compte doit plutôt être plutôt nul (possibilité de transférer le compte)
1- Créer cette base de donné en respectant les contraintes d’intégrité et en utilisant les types appropriés
2- Ecrire une fonction qui calcule l’âge d’un employé dans l’entreprise
3- Ecrire une procédure qui augmente de 4% le salaire d’un employé donc Age dans l’entreprise dépasse 2 ans
4- Ecrire un trigger à l’insertion d’une nouvelle opération concerner calcule le nouveau solde du compte en se basant sur le montant de l’opération
Ce commentaire a été supprimé par l'auteur.
RépondreSupprimerJe veux la correction svp
RépondreSupprimer