0% ont trouvé ce document utile (0 vote)
7 vues2 pages

Exercices PL/SQL : Conversion et Moyenne

Transféré par

RafaqabdRafaq
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
7 vues2 pages

Exercices PL/SQL : Conversion et Moyenne

Transféré par

RafaqabdRafaq
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

[Link].

com Correction Exercice 1


Exercices – PL/SQL

-- Creation de la table PRODUIT2000 a partir de la table PRODUIT


Exercice 1
DECLARE
euro CONSTANT REAL:=6.55957;
2001, il est temps de passer à l’Euro pour l’entreprise de VPC dont la base de données nbprod NUMBER(3);
CLIENT- COMMANDE-PRODUIT-FOURNISSEUR sert d’exemple dans le cours. Écrire aucun_produit EXCEPTION;
un programme PL/SQL permettant de construire, à partir de la table PRODUIT, une table CURSOR acces IS
PRODUIT2000 telle que : SELECT numprod, desi, prixuni, numfour FROM produit;
prod acces%ROWTYPE;
newdesi [Link]%TYPE;
• la désignation des produits soit écrite en majuscules ; newprix [Link]%TYPE;
• le prix unitaire en francs des produits soit converti en Euros. Le prix en Euros devra être entier
BEGIN
(arrondir au supérieur). -- Compte des produits
SELECT COUNT(*) INTO nbprod FROM PRODUIT;
Cas particuliers à traiter :
-- Si pas de produits, exception
• Si la table PRODUIT est vide, la table PRODUIT2000 devra contenir uniquement le tuple IF nbprod=0 THEN
(0,’Pas de produit’, NULL, NULL). RAISE aucun_produit;
• Si un prix de la table produit est NULL, son prix en Euros doit être 0. END IF;

-- Acces sequentiel a la table PRODUIT


Indications : -- Remplissage de la table PRODUIT2000
FOR prod IN acces LOOP
• Considérer que la structure de la table PRODUIT2000 a déjà été créée. newdesi:=UPPER([Link]);
• Tester si la table PRODUIT est vide. Si ce n’est pas le cas, y accéder séquentiellement à l’aide newprix:=NVL([Link],0);
d’un curseur, effectuer les transformations sur les champs et stocker le résultat dans la table IF newprix<>0 THEN
PRODUIT2000. newprix:=TRUNC(newprix/euro)+1;
END IF;
• Utiliser les fonctions SQL*Plus UPPER, TRUNC et NVL. INSERT INTO produit2000
VALUES([Link],newdesi,newprix,[Link]);
END LOOP;
Exercice 2
-- Validation de la transaction
COMMIT;
Pour tenter d’établir une corrélation, on souhaite connaître la différence de quantité moyenne entre les
commandes successivement enregistrées dans la table COMMANDE de la base de données CLIENT- EXCEPTION
COMMANDE-PRODUIT-FOURNISSEUR. La table COMMANDE est remplie de commandes va- WHEN aucun_produit THEN
luées (c’est-à-dire, pour lesquelles l’attribut QUANTITE n’est pas NULL) ou non. Les commandes non INSERT INTO produit2000
VALUES(0,'Pas de produit',NULL,NULL);
valuées ne sont pas à prendre en compte. Écrire un programme PL/SQL permettant de calculer la diffé-
rence de quantité moyenne entre les commandes. END;
.
Cas particuliers à traiter : /

• La table COMMANDE contient moins de deux commandes valuées.

Indications :
• Créer un curseur contenant les quantités de commandes valuées.
• Lire la première quantité puis, pour toutes les quantités suivantes, cumuler la valeur absolue de
quantité courante – quantité précédente (fonction ABS).
• Afficher le résultat dans une exception à l’aide de la procédure RAISE_APPLICATION_ERROR.
Utiliser l’opérateur de concaténation || et la fonction TO_CHAR.

Exercices – PL/SQL 1/1 Exercices – PL/SQL Correction 1/2

[Link]
Correction Exercice 2

-- DIFFERENCE MOYENNE DE QUANTITE ENTRE LES COMMANDES

DECLARE
CURSOR valuees IS
SELECT quantite FROM commande WHERE quantite IS NOT NULL;
cde valuees%ROWTYPE;
prec REAL; -- quantite precedente
cour REAL; -- quantite courante
cumul REAL;
moyenne REAL;
ncv INTEGER;
n INTEGER;
pas_assez EXCEPTION;
resultat EXCEPTION;

BEGIN
-- Test nombre de commandes valuees
SELECT COUNT(*) INTO ncv FROM commande WHERE quantite IS NOT NULL;
IF ncv<2 THEN
RAISE pas_assez;
END IF;

-- Acces 1er tuple


OPEN valuees;
FETCH valuees INTO cde;
prec:=[Link];

-- Acces aux suivants et cumul


cumul:=0;
n:=0;
LOOP
FETCH valuees INTO cde;
EXIT WHEN valuees%NOTFOUND;
cour:=[Link];
cumul:=cumul+ABS(cour-prec);
n:=n+1;
prec:=cour;
END LOOP;
CLOSE valuees;

-- Calcul et affichage de la moyenne


moyenne:=cumul/n;
RAISE resultat;

EXCEPTION
-- Erreur
WHEN pas_assez THEN
RAISE_APPLICATION_ERROR(-20501,'Pas assez de commandes');
-- Resultat
WHEN resultat THEN
RAISE_APPLICATION_ERROR(-20500,'Moyenne = '||TO_CHAR(moyenne));

END;
.
/

Exercices – PL/SQL Correction 2/2

[Link]

Vous aimerez peut-être aussi