mardi 3 mars 2015

Exercice 3 : Procédures Fonctions Triggers Sql + Correction

Exercice 3 : Procédures Fonctions Triggers Sql + Correction logo
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 :
Exercice 3 : Procédures Fonctions Triggers Sql exercice
Correction :

/*La création*/
create database Agence
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

11 commentaires:

  1. Thanks a lot Zakaria boukaddouss

    RépondreSupprimer
  2. Les membres dirigeants d'une association de votre région se servent d'une base de données
    permettant 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

    RépondreSupprimer
  3. EXERCICE : Modèle relationnel gestion des comptes bancaires (chercheurs)
    Agence (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

    RépondreSupprimer
  4. Ce commentaire a été supprimé par l'auteur.

    RépondreSupprimer