- 2013-04-21 - Licence Fondamentale d'Informatique
dimanche 21 avril 2013

Exercice : vues


  1. Créez une vue V_EMP contenant : le matricule, le nom, le numéro de département, la somme de la commission et du salaire baptisée GAINS, le lieu du département.
  2. Sélectionnez les lignes de V_EMP dont le salaire total est supérieur à 10.000 F
  3. Essayez de mettre à jour le nom de l'employé MARTIN à travers la vue V_EMP.
  4. Créez une vue VEMP10 qui ne contienne que les employés du département 10 de la table EMP (n'utilisez pas l'option CHECK pour cette création).
  5. Insérez dans cette vue un employé SOULIER qui appartient au département 20.
    Essayez ensuite de retrouver cet employé au moyen de la vue VEMP10 puis au moyen de la table EMP.  
  6. Détruisez cette vue VEMP10 et recréez-la avec l'option CHECK.
  7. Essayez d'insérer un employé BALARD pour le département 30. Que se passe-t-il ?
  8. Essayez de modifier le département d'un employé visualisé à l'aide de cette vue.
  9. Liste des salaires des employés avec le pourcentage par rapport au total des salaires de leur département (utilisez une vue qui fournira le total des salaires).
  10. Vous pourrez chercher une autre solution qui n'utilise pas de vue mais un select emboîté dans le from.


---------------------------------
corrogier

create view v_emp (matr, nom, dept, GAINS, lieu) as
  select matr, nome, emp.dept, sal + nvl(comm,0), lieu
  from emp,dept
  where emp.dept = dept.dept;select * from v_emp where SALTOT > 10000;
update v_emp set nome = 'TOTO' where nome = 'MARTIN';
-----
create view vemp10 as select * from emp where dept=10;
insert into vemp10 values
(1117, 'SOULIER', 'RANGER', 7839, '18/05/81', 10000, 300, 20);
drop view vemp10;
create view VEMP10 as select * from emp
where dept = 10 with check option;
insert into vemp10 values
(0007, 'BALARD', 'OUVRIER', 7839, '18-MAY-81', 10000, 300, 20);
ORA-01402: view WITH CHECK OPTION where-clause violation
update vemp10 set dept=20 where nome='LESAGE';
On ne peut pas non plus utiliser update pour la meme raison.
-----
create view vt (dept, total) as
  select dept, sum(sal+nvl(comm,0)) from emp group by dept;
select nome, sal+nvl(comm,0) salaire, (sal+nvl(comm,0))/total pourcentage
from vt,emp
where vt.dept=emp.dept;
Avec les nouvelles possibilités offertes par SQL (select emboîté dans la clause from) on peut se passer de la création d'une vue:
select nome, sal+nvl(comm,0) salaire, round((sal+nvl(comm,0))/total*100) pourcentage, emp.dept
from emp, (select dept, sum(sal+nvl(comm,0)) total from emp group bydept) e1
where e1.dept = emp.dept;
Si on veut bien utiliser les facilités offertes par SQL*PLUS(pas dans SQL) :
break on dept skip 1
compute sum of salaire on dept
column pourcentage format a7
select nome, sal+nvl(comm,0) salaire,
       to_char(round((sal+nvl(comm,0))/total*100), '999')||' %' pourcentage,  emp.dept
from emp, (select dept, sum(sal+nvl(comm,0)) total from emp group bydept) e1
where e1.dept = emp.dept
order by 4;
 

Create View


Les vues peuvent être considérées comme des tables virtuelles. Généralement, une table contient un jeu de définitions et elle est destinée à stocker physiquement les données. Une vue a également un jeu de définitions, créé au-dessus des tables ou d’autres vues, et elle ne stocke pas physiquement les données.
La syntaxe pour la création d’une vue est comme suit :
CREATE VIEW "nom de vue" AS "instruction SQL"
"instruction SQL" peut être n’importe quelle instruction SQL que nous avons vue dans ce didacticiel.
À titre d’illustration, utilisons un exemple simple. Supposons que nous avons la table suivante :
TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date date)


et pour créer une vue appelée V_Customer contenant seulement les colonnes First_Name, Last_Name et Country de cette table, il faut saisir :
CREATE VIEW V_Customer
AS SELECT First_Name, Last_Name, Country
FROM Customer

Nous avons à présent une vue appelée V_Customer avec la structure suivante :
View V_Customer
(First_Name char(50),
Last_Name char(50),
Country char(25))

Il est aussi possible d’utiliser une vue pour appliquer des jointures à deux tables. Dans ce cas, les utilisateurs ne verront qu’une vue au lieu de deux tables, disposant ainsi d’instructions SQL beaucoup plus simples. Supposons que nous avons les deux tables suivantes :
Table Store_Information
store_nameSalesDate
Los Angeles1500 €05-Jan-1999
San Diego250 €07-Jan-1999
Los Angeles300 €08-Jan-1999
Boston700 €08-Jan-1999

Table Geography
region_namestore_name
EastBoston
EastNew York
WestLos Angeles
WestSan Diego

et pour créer une vue contenant des ventes par données de région, il faudra définir l’instruction SQL suivante :
CREATE VIEW V_REGION_SALES
AS SELECT A1.region_name REGION, SUM(A2.Sales) SALES
FROM Geography A1, Store_Information A2
WHERE A1.store_name = A2.store_name
GROUP BY A1.region_name

Nous avons la vue V_REGION_SALES, définie pour stocker les ventes par enregistrements de région. Pour connaître le contenu de cette vue, il faut saisir :
SELECT * FROM V_REGION_SALES
Résultat :
REGIONSALES
East700 €
West2050 €
 
-