Académique Documents
Professionnel Documents
Culture Documents
TP Delphi Interbase 2
TP Delphi Interbase 2
TP Delphi Interbase
EMPLOYES
DEPARTEMENTS
NUM_EMP SMALLINT
1,N 1,1
NOM_EMP VARCHAR(20),
CODE_DEP CHAR(4) , Appartient
PRENOM_EMP VARCHAR(20),
DES_DEP VARCHAR(20), DATE_NAIS DATE
SITUATION_FAMILIALE CHAR(1),
SALAIRE DOUBLE PRECISION,
ADRESSE VARCHAR (40),
Remarque : Avant de créer la table employés, on va créer une intégrité du domaine sur le champ
Situation_Familiale et une autre sur le champ Salaire.
Domaine TYPE_SALAIRE :
CREATE DOMAIN "TYPE_SALAIRE"
AS DOUBLE PRECISION
DEFAULT 8000
CHECK (VALUE>=8000 AND VALUE<=30000);
Suppression d'enregistrements :
DELETE FROM <nom de la table>
WHERE <conditions de suppression>
2
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
Ajouter la somme 200 dans le salaire pour tous les employés sans conditions :
UPDATE EMPLOYES
SET SALAIRE=SALAIRE+200
Faire : SELECT * FROM EMPLOYES; pour vérifier la mise à jour des enregistrements
Changer la Situation Familiale pour le salarié dont le numéro est 1 car il est maintenant Marié :
UPDATE EMPLOYES
SET SITUATION_FAMILIALE='M'
WHERE NUM_EMP=21
Toujours faire : SELECT * FROM EMPLOYES ; pour vérifier la mise à jour sur l'enregistrement
Extraction de Données :
SELECT *
FROM EMPLOYES
Avec Condition:
SELECT * FROM EMPLOYES
WHERE NUM_EMP=1
Extraction de données avec Tri des enregistrements (par défaut le tri est croissant) :
SELECT * FROM EMPLOYES
ORDER BY NOM_EMP
3
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
Avec conditions:
SELECT COUNT (NUM_EMP)
FROM EMPLOYES
WHERE SALAIRE >20000
Avec conditions:
SELECT AVG (SALAIRE)
FROM EMPLOYES
WHERE CODE_DEP IN ('INFO', 'ELEC')
Cette requête permet d'avoir la moyenne des salaires pour les employés ayant la même situation
familiale :
SELECT SITUATION_FAMILIALE, AVG(SALAIRE)
FROM EMPLOYES
GROUP BY SITUATION_FAMILIALE
La requête suivante donne la somme des salaires pour les employés affectés au même
département :
SELECT CODE_DEP, SUM (SALAIRE)
FROM EMPLOYES
GROUP BY CODE_DEP
Remarque : Uniquement le champ mentionné dans la clause GROUP BY apparait dans la clause
SELECT (ne pas inclure les autres champs de la table) mais vous pouvez inclure des fonctions
d'agrégation au niveau de la clause SELECT.
La requête suivante permet d'avoir la moyenne des salaires pour les employés ayant la même
situation familiale et qui est supérieure à 14000.
4
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
1. La Jointure Interne : Une jointure interne permet d'afficher les champs spécifiés dans la clause
SELECT des deux tables satisfaisant la ou les conditions de jointure, à condition que ces deux
tables aient un champ en commun.
Exemple : je veux afficher tous les noms et prénoms de la table EMPLOYES avec la désignation du
département au quel ils sont affectés, sachant que le champ désignation département est un
champ de la table DEPARTEMENTS.
SELECT EMPLOYES.NOM_EMP, EMPLOYES.PRENOM_EMP, DEPARTEMENTS.DES_DEP
FROM EMPLOYES INNER JOIN DEPARTEMENTS
ON EMPLOYES.CODE_DEP=DEPARTEMENTS.CODE_DEP
2. La Jointure Externe Gauche : Une jointure externe gauche permet d'afficher tous les champs de
la table gauche puis tous les champs spécifiés dans la clause SELECT des deux tables satisfaisant
la ou les conditions de jointure.
3. La jointure Externe Droite : Une jointure externe droite permet d'afficher tous les champs de la
table droite puis tous les champs spécifiés dans la clause SELECT des deux tables satisfaisant la
ou les conditions de jointure.
Syntaxe : RIGHT OUTER JOIN
Exemple : L'exemple suivant affiche tous les noms et prénoms de la table EMPLOYES avec la
désignation du département au quel ils sont affectés plus les départements qui ne possèdent pas
encore d'employés.
SELECT EMPLOYES.NOM_EMP, EMPLOYES.PRENOM_EMP, DEPARTEMENTS.DES_DEP
FROM EMPLOYES RIGHT OUTER JOIN DEPARTEMENTS
ON EMPLOYES.CODE_DEP=DEPARTEMENTS.CODE_DEP
1. Création de comptes User : Après s'être connecté au serveur InterBase avec l'outil Server
Manager, et à la base de données via Server Manager, cliquez sur User Security une boite de
dialogue apparait vous permettant de créer des comptes User, de supprimer et de modifier des
comptes existants.
2. Gestion des permissions sur les comptes User : A tout moment vous pouvez affecter ou retirer
une permission à un compte use.
Exemple : Soient les comptes user suivants : POSTE1, POSTE2, POSTE3, POSTE4
5
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
GRANT : Elle permet d'affecter une permission, l'exemple ci dessus permet d'affecter les
permissions de lecture et de suppression sur la table EMPLOYES de la base de données en cours
pour les comptes POSTE1 et POSTE4.
Remarque : Lors de la création des comptes user aucune permission n'est accorder aux comptes,
il faut que l'administrateur accorde d'abord les permissions aux comptes.
3. Gestion des permissions sur des Rôles : Un rôle est tout simplement un regroupement de
comptes user ayant les mêmes permissions, au lieu d'affecter les permissions à chacun des user
on les regroupe au sein du même rôle puis on affecte des permissions à ces rôles.
Création de Rôle :
CREATE ROLE <nom du rôle>
Exemple CREATE ROLE IFPUSER
Remarque : GRANT IFPUSER TO POSTE2, POSTE3 permet d'affecter les comptes user POSTE2 et
POSTE3 au rôle ROLUSER On affecte les permissions aux rôles de la même manière qu'avec les
comptes user.
Les Procédures Stockées : Une procédure stockée est code SQL s'exécutant sur le serveur
InterBase, il permet de réduire le trafic du réseau pur les Users.
1. Exemple d'une procédure stockée sous Interbase : La procédure suivante permet de modifier le
salaire d'un employé à partir de son numéro, ainsi si son salaire est >=20000 il aura une
augmentation d'un montant A et si son salaire est <20000 il aura une augmentation d'un
montant B.
SET TERM ^;
CREATE PROCEDURE MODIFSAL (ID SMALLINT, A DOUBLE PRECISION, B DOUBLE PRECISION)
AS
DECLARE VARIABLE Sale DOUBLE PRECISION;
BEGIN
Sale=0;
SELECT SALAIRE
FROM EMPLOYES
WHERE (NUM_EMP=:ID)
INTO Sale;
IF (Sale<20000) THEN
UPDATE EMPLOYES
SET SALAIRE=SALAIRE+:A
WHERE (NUM_EMP=:ID);
ELSE
UPDATE EMPLOYES
SET SALAIRE=SALAIRE+:B
WHERE (NUM_EMP=:ID);
END^
SET TERM ;
6
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
TP N° 02
Partie 1 :
Soit le modèle conceptuel des données suivant :
Module Stagiaire
NumMod Noter NumStag
NomMod 1,N E1 1,N NomStag
E2 GenreStag
Syn DateNaiss
1,1 1,1
Specialite
1,N CodeSP 1,N
Comporte Inscrit
Des_SP
7
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
Solution :
Partie 1 :
/*Création domain Genre */
CREATE DOMAIN Genre AS CHAR(1)
CHECK (VALUE IN ('H', 'F'));
8
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
Partie 2 :
1. Afficher la liste des stagiaires (NumStag, NomStag, GenreStag, DateNaiss, CodeSP) :
SELECT * FROM STAGIAIRE;
5. Afficher pour le stagiaire N° 10 la liste des notes (Nom Module, coefficient du module, Emd1, Emd2, Synthèse,
MoyMod = (E1+E2+Syn)/4 et Moy_Mod_Coef= (E1+E2+SYN)/4*Coef.
SELECT NomMod,Coef, E1,E2,SYN, (E1+E2+SYN)/4 AS MOY_MOD, (E1+E2+SYN)/4*Coef AS MOY_MOD_COEF
FROM (STAGIAIRE S INNER JOIN NOTER N ON S.NumStag=N.NumStag)
INNER JOIN MODULE M ON N.NumMod=M.NumMod
WHERE NumStag=10
7. Ecrire une transaction pour insérer le module « Implémentation SQL Server » avec coefficient 5 et note
éliminatoire 8.
INSERT INTO MODULE (NomMod, Coef, NoteE)
VALUES (‘Implémentation SQL Server’,5 ,8);
Partie 3 :
1. Procédure Stockée Nombre de Stagiaires Inscris :
SET TERM^;
CREATE PROCEDURE NB_STAG_INSCRIS
RETURNS ( NBRSTAG INTEGER)
AS
9
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
BEGIN
SELECT COUNT(*) FROM STAGIAIRE
INTO
:NBRSTAG;
SUSPEND;
END ^
SET TERM;^
/*Exécution de la procédure
SELECT * FROM NB_STAG_INSCRIS_Par_SP
10
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
:EMD2,
:SYNT,
:MOY,
:MOYCOEF
DO
SUSPEND;
END^
SET TERM;^
11
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
Les Vues : 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.
Les vues sont nécessaires pour gérer finement les privilèges. Elles sont utiles pour masquer la
complexité de certains modèles relationnels.
Nom_vue : Nom de la vue; doit être unique parmi tous noms de vue, de table et de procédure dans la base de
données
Nom_Col : Noms de colonne de la vue.
Les noms de colonne doivent être uniques parmi tous les noms de colonnes dans la vue.
Obligatoire si la vue contient des colonnes basées sur des expressions, autrement optionnels.
Valeur par défaut: Nom de la colonne de la table sous-jacente
WITH CHECK OPTION : La clause WITH CHECK OPTION implique que si la vue peut être mise à jour, alors les valeurs
modifiées insérées ou supprimées doivent répondre à la validation de la clause WHERE comme s'il s'agissait d'une
contrainte.
Supposons que nous avons la table suivante :
TABLE CLIENT
(Nom_Client Varchar(20), Prenom_Client Varchar(20), Address Varchar(50), Ville Varchar(50))
Pour créer une vue appelée V_Client contenant seulement les colonnes Nom, Prenom et Adresse de cette
table, il faut saisir :
CREATE VIEW V_Client
AS SELECT Nom_Client, Prenom_Client, Adresse
FROM CLIENT
Nous avons à présent une vue appelée V_Client avec la structure suivante :
View V_Client
(Nom_Client Varchar(20), Prenom_Client Varchar(20), Adresse Varchar(50))
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 :
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_VENTE_REGION
AS SELECT A1.Lieu REGION, SUM(A2.Vente) VENTES
FROM Geographie A1, Stock A2
12
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
WHERE A1.Lieu = A2.Lieu
GROUP BY A1.Region
Nous avons la vue V_VENTES_REGION, 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_VENTES_REGION
Résultat :
REGION VENTES
Est 7000
West 2050
Bien évidemment une vue peut porter sur une autre vue et pour que la nouvelle vue construite à partir d'une
autre vue puisse être modifié, il faut que les deux vues répondent aussi à ces critères.
En fait c'est plus simple qu'il n'y parait; il suffit que le SGBDR puisse retrouver trace de la ligne dans la table et de
chaque valeur de chaque colonne.
Par exemple dans le cadre de la vue pour le service comptable, il n'est pas possible de faire :
UPDATE T_EMPLOYE
SET EMP_SALAIRE = EMP_SALAIRE + 100
WHERE STATUT = 'CADRE'
14
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
8. Les vues
Les vues de la norme SQL 2 ne sont autre que des requêtes instanciées.
Elles sont nécessaires pour gérer finement les privilèges. Elles sont utiles pour masquer la complexité de certains
modèles relationnel.
-- la table suivante :
CREATE TABLE T_TARIF
(TRF_ID INTEGER PRIMARY KEY,
TRF_DATE DATE,
PRD_ID INTEGER,
TRF_VALEUR FLOAT)
-- permet de stocker l'évolution d'un tarif, sachant que celui-ci n'est applicable
-- pour un produit donné (PRD_ID) qu'à partir de la date TRF_DATE
INSERT INTO T_TARIF VALUES (1, '1996-01-01', 53, 123.45)
INSERT INTO T_TARIF VALUES (2, '1998-09-15', 53, 128.52)
INSERT INTO T_TARIF VALUES (3, '1999-12-31', 53, 147.28)
INSERT INTO T_TARIF VALUES (4, '1997-01-01', 89, 254.89)
INSERT INTO T_TARIF VALUES (5, '1999-12-31', 89, 259.99)
INSERT INTO T_TARIF VALUES (6, '1996-01-01', 97, 589.52)
15
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com
Programmer en réseau à l’aide d’un langage orienté objet
Bien évidemment une vue peut porter sur une autre vue et pour que la nouvelle vue construite à partir d'une autre
vue puisse être modifié, il faut que les deux vues répondent aussi à ces critères.
En fait c'est plus simple qu'il n'y parait : il suffit que le SGBDR puisse retrouver trace de la ligne dans la table et de
chaque valeur de chaque colonne.
Par exemple dans le cadre de la vue pour le service comptable, il n'est pas possible de faire :
UPDATE T_EMPLOYE
SET EMP_SALAIRE = EMP_SALAIRE + 100
WHERE STATUT = 'CADRE'
16
Réalisé par : M.L. Belaïd Email : alias.bml@gmail.com