Vous êtes sur la page 1sur 5

Réponses:

1/

DELIMITER $$
CREATE PROCEDURE Nbr_clients(OUT nb int)
BEGIN
select count(*) into nb from clients;
END $$
DELIMITER ;
//

CALL Nbr_clients(@x);

select @x as 'Nbr clients';

2/

DELIMITER $$
CREATE PROCEDURE Produits_par_stock(idstk int)
BEGIN
DECLARE nb int default 0;
select count(*) into nb from produits where stock=idstk;
IF nb=0 THEN
select 'Aucun produit trouvé de ce stock' as 'Message';
ELSE
select * from produits where stock=idstk;
END IF;
END $$
DELIMITER ;

3/

DELIMITER $$
CREATE PROCEDURE PS_Total_Achat(IN clt int , OUT tot int)
BEGIN
select sum(l.prixachat*l.qteachat) into tot from ligneachats l inner join achats a on a.nachat = l.achat
where a.client = clt;
END $$
DELIMITER ;
5/

DELIMITER $$
CREATE PROCEDURE PS_Produits_plus_achates()
BEGIN
DECLARE maxtot FLOAT DEFAULT 0;

select tot into maxtot from (select sum(prixachat*qteachat) as tot , produit from ligneachats group
by produit order by sum(prixachat*qteachat) desc limit 1) as T;
select p.* from produits p inner join ligneachats l on l.produit = p.refpdt
group by p.refpdt
having sum(l.prixachat*l.qteachat) = maxtot;
END $$
DELIMITER ;

6/

DELIMITER $$
CREATE PROCEDURE PS_Top_Clients()
BEGIN
DECLARE cp int default 0;
DROP TABLE IF EXISTS RST;
CREATE TABLE RST(
Numero int ,
Nom varchar(100),
prenom varchar(100) ,
tel varchar(10) ,
total float ,
annee int
);
WHILE cp<3 DO

insert into RST


select nclt, nom , prenom , tel , sum(prixachat*qteachat) tot , year(curdate())-cp from clients
inner join achats on achats.client = clients.nclt inner join ligneachats on ligneachats.achat =
achats.nachat
where year(dateachat) = year(curdate()) - cp
group by nclt order by sum(prixachat*qteachat) desc limit 1;
set cp = cp +1;
END WHILE;
select * from RST;
DROP TABLE RST;
END $$
DELIMITER ;

7/

DELIMITER $$
CREATE PROCEDURE PS_Total_Achats_Par_Annee()
BEGIN
DECLARE cp int default 0;
DROP TABLE IF EXISTS RST;
CREATE TABLE RST(
total float ,
annee int
);
WHILE cp<3 DO
insert into RST
select sum(prixachat*qteachat) tot , year(curdate())-cp from achats inner join ligneachats on
ligneachats.achat = achats.nachat
where year(dateachat) = year(curdate()) - cp
group by year(dateachat);
set cp = cp +1;
END WHILE;
select * from RST;
DROP TABLE RST;
END $$
DELIMITER ;

7/ avec l'utilisation de la fonction stockée (TotalAchat)

DELIMITER $$
CREATE PROCEDURE PS_Total_Achats_Par_Annee2()
BEGIN
DECLARE cp int default 0;
DROP TABLE IF EXISTS RST;
CREATE TABLE RST(
total float ,
annee int
);
WHILE cp<3 DO
insert into RST values(TotalAchat(year(curdate())-cp) , year(curdate())-cp)
set cp = cp +1;
END WHILE;
select * from RST;
DROP TABLE RST;
END $$
DELIMITER ;

6.2. / Function stockée

Une fonction stockée est un sous-programme qui retourne une valeur d’un type de données, ce
programme réalise un traitement selon des paramètres(optionnelles)

Syntaxe :

DELIMITER $$
CREATE FUNCTION NomFonction(para1 type ,
para2 type , ....)
RETURNS typededonnée
BEGIN
Traitement;
RETURN(Valeur)
END $$
DELIMITER ;

Exemple : (fonction qui retourne la somme de deux entiers)

DELIMITER $$
CREATE FUNCTION SOMME(a int , b int)
RETURNS int
BEGIN
RETURN(a+b);
END $$
DELIMITER ;

Exemple : (une fonction qui retourne le nombre des clients)

DELIMITER $$
CREATE FUNCTION Nbr_Client()
RETURNS INT
BEGIN
DECLARE nb int DEFAULT 0;
select count(*) into nb from clients;
RETURN(nb);
END $$
DELIMITER ;

Exemple : (fonction qui retourne le total d’achat pour une année donnée en paramètre)

DELIMITER $$
CREATE FUNCTION TotalAchat(annee INT)
RETURNS FLOAT
BEGIN
DECLARE tot FLOAT DEFAULT 0;
select sum(l.prixachat*l.qteachat) into tot from ligneachats l inner join achats a on a.nachat = l.achat
where year(a.dateachat) =annee;
RETURN(tot);
END $$
DELIMITER ;
//

select TotalAchat(2020);

Question:

Afficher le total d’achat par an !

select year(dateachat) as annee , TOTALACHAT(year(dateachat)) as total from achats group by


year(dateachat);

Exemple: (une function qui retourne le total d’achat d’un client donné pour une année donnée)

DELIMITER $$
CREATE FUNCTION TotalAchat_Client(annee INT , clt INT)
RETURNS FLOAT
BEGIN
DECLARE tot FLOAT DEFAULT 0;
select sum(l.prixachat*l.qteachat) into tot from ligneachats l inner join achats a on a.nachat = l.achat
where year(a.dateachat) =annee and a.client = clt;
RETURN(tot);
END $$
DELIMITER ;
//

select TotalAchat_Client(2022 , 1) as Total;

6.3./ Triggers

Vous aimerez peut-être aussi