Corrigé Series Exercice PL-SQL Exercices Oracle SQL

- Solution des exercices

Correction Exercice 1

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

DECLARE
euro CONSTANT REAL:=6.55957;
nbprod NUMBER(3);
aucun_produit EXCEPTION;

CURSOR acces IS

SELECT numprod, desi, prixuni, numfour FROM produit;
prod acces%ROWTYPE;
newdesi produit.desi%TYPE;
newprix produit.prixuni%TYPE;

BEGIN
-- Compte des produits
SELECT COUNT(*) INTO nbprod FROM PRODUIT;

-- Si pas de produits, exception
IF nbprod=0 THEN
     RAISE aucun_produit;
END IF;

-- Acces sequentiel a la table PRODUIT
-- Remplissage de la table PRODUIT2000
FOR prod IN acces LOOP
   newdesi:=UPPER(prod.desi);
   newprix:=NVL(prod.prixuni,0);

   IF newprix<>0 THEN
        newprix:=TRUNC(newprix/euro)+1;
   END IF;

INSERT INTO produit2000
     VALUES(prod.numprod,newdesi,newprix,prod.numfour);
END LOOP;

-- Validation de la transaction
COMMIT;

EXCEPTION
  WHEN aucun_produit THEN
       INSERT INTO produit2000
           VALUES(0,'Pas de produit',NULL,NULL);

END;
.
/



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:=cde.quantite;

-- Acces aux suivants et cumul cumul:=0;
n:=0;
LOOP
  FETCH valuees INTO cde;
  EXIT WHEN valuees%NOTFOUND;
  cour:=cde.quantite;
  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;
.
/





                     

Article plus récent Article plus ancien

Leave a Reply