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;BEGINSELECT ... INTO qte_vendue
FROM ... WHERE ...IF ... THEN
RETURN ('forte');
...
ELSE...
END IF;
END fDemande;/
SHOW ERRORSSolution
Solution avec un IF ... ELSIF ...
CREATE OR REPLACE FUNCTION fDemande (num_produit in number) RETURN varchar
IS qte_vendue NUMBER;BEGINSELECT 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');
ELSERETURN('faible');
END IF;
END fDemande;/
SHOW ERRORSSolution alternative avec un CASE
CREATE OR REPLACE FUNCTION fDemande (num_produit in number) RETURN varchar
IS qte_vendue NUMBER;BEGINSELECT sum(lf.qte) INTO qte_vendue
FROM ligne_fact lf WHERE lf.produit=num_produit; CASEWHEN qte_vendue > 15 THEN
RETURN ('forte');
WHEN qte_vendue BETWEEN 11 AND 15 THEN RETURN ('moyenne');
ELSE RETURN('faible');
END CASE;
END fDemande;/
SHOW ERRORSQuestion
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 offSPOOL /tmp/inventaire.txtSELECT num || '(' || designation || ') : ' || fDemande(num) FROM produit;
SPOOL OFF