Fonctions stockées
[30 min]
À la fin de chaque année, le fournisseur des produits du projet MediaTek demande à l'association un inventaire sur les produits vendus. Cet inventaire lui est envoyé par e-mail pour analyse et traitement. L'information demandée est la suivante : donner pour chaque produit, sa désignation, son prix actuel, et une mention sur la demande :
demande "forte" si le nombre d'articles vendus dépasse 15,
demande "moyenne" si le nombre d'articles vendus est compris entre 11 et 15,
et demande "faible" sinon.
Question
Écrire une fonction stockée qui retourne la valeur de demande (forte, moyenne, faible) en fonction d'un numéro de produit.
Indice
Pensez à utiliser l'instruction show errors
en fin de block PL/SQL pour avoir en retour les éventuelles erreurs de complication.
Indice
Utilisez la trame suivante pour vous aider.
CREATE OR REPLACE FUNCTION fDemande (num_produit number) RETURN varchar
IS
qte_vendue NUMBER;
BEGIN
SELECT ... INTO qte_vendue
FROM ...
WHERE ...
IF ... THEN
RETURN ('forte');
...
ELSE
...
END IF;
END fDemande;
/
SHOW ERRORS
Solution
Solution avec un IF ... ELSIF ...
CREATE OR REPLACE FUNCTION fDemande (num_produit in number) RETURN varchar
IS
qte_vendue NUMBER;
BEGIN
SELECT sum(lf.qte) INTO qte_vendue
FROM ligne_fact lf
WHERE lf.produit=num_produit;
IF (qte_vendue > 15) THEN
RETURN ('forte');
ELSIF (qte_vendue BETWEEN 11 AND 15) THEN
RETURN ('moyenne');
ELSE
RETURN('faible');
END IF;
END fDemande;
/
SHOW ERRORS
Solution alternative avec un CASE
CREATE OR REPLACE FUNCTION fDemande (num_produit in number) RETURN varchar
IS
qte_vendue NUMBER;
BEGIN
SELECT sum(lf.qte) INTO qte_vendue
FROM ligne_fact lf
WHERE lf.produit=num_produit;
CASE
WHEN qte_vendue > 15 THEN
RETURN ('forte');
WHEN
qte_vendue BETWEEN 11 AND 15 THEN RETURN ('moyenne');
ELSE
RETURN('faible');
END CASE;
END fDemande;
/
SHOW ERRORS
Question
Question
Écrire un bloc PL/SQL permettant d'obtenir l'état suivant sous la forme d'un fichier texte inventaire.txt
:
1(Matrix) : moyenne
2(Seigneur des anneaux) : forte
3(Mistral Gagnant) : faible
Indice
On utilisera la fonction de concaténation ||
Solution
SET heading off
SPOOL /tmp/inventaire.txt
SELECT num || '(' || designation || ') : ' || fDemande(num) FROM produit;
SPOOL OFF