Création d'une base de données Oracle
Création d'une base de données Oracle
TP1
2010/2011
ORACLE
2
• Pour créer la base, nous allons
– créer une variable d'environnement ORACLE_SID
– créer un service
– créer le fichier de paramètres
– démarrer l'instance et la base
– créer la base
– créer les tables système
– créer une TableSpace
– vérifier la création d'une table
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 3
• utiliser une instance Oracle SID (System IDentifier).
• pour cela nous devons créer une variable d'environnement DOS contenant
ce SID
• création de cette variable est effectuée en utilisant la commande DOS SET
2010/2011 ORACLE 4
• Créer un Service Windows qui gèrera notre instance
C:\oracle\product\10.1.0\Db_1\database
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 5
• L'instruction de création de la base utilisera un fichier de paramètres.
binaire, appelé SPFILE.
• Ce fichier binaire est généré à partir d'un fichier ASCII [Link] que nous
devons créer.
• L’installation oracle place un fichier dans le répertoire [Link]
c:\oracle\product\10.1.0\Db_1\admin\sample\pfile
2010/2011 ORACLE 6
• Sauvegardez ce fichier (utilisez bloc note)
db_name = master_base
db_block_size = 2048
# trace (log) files
control_files = C:\ORACLE\master\control01_master_sid.ora
# add if undo in create database
undo_management = auto
• dans:
c:\Oracle\master\master_init\init_master_sid.ora
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 7
• L'instance va être démarrée en utilisant SqlPlus
• Lancer SqlPlus avec l'option /nolog (nolog= NO LOGin= lancement sans fournir
User/password)
• une fois sous SqlPlus
– nous nous connectons en tant que SYS/mon_mot_de_passe AS SYSDBA
– nous exécutons CREATE DATABASE avec les paramètres de création
– nous créons les fichiers système, puis éventuellement nos tables
• Nous utilisons un script pour démarrée l’instance
– nous tapons les commandes à exécuter dans un fichier ASCII construit avec l'éditeur de
votre choix (Notepad ou autre fonctionne aussi) et sauvegardons le texte dans un fichier
ayant n'importe quel nom (par exemple the_script.txt)
• dans SqlPlus nous invoquons le script en tapant:
• @? \le_script.txt
• Sous SqlPlus
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 8
• Tapez et sauvegardez sous : c:\Oracle\master\mql_script\create_database.txt
2010/2011 ORACLE 10
• La base créée est vide, et il faut exécuter des scripts qui installent des tables et
programmes systèmes dans la base:
[Link] crée le dictionnaire de données
[Link] créé les structures pour PL/SQL.
• Tapez les ligne suivant (SqlPlus lance ces deux scripts (20 minutes))
2010/2011 ORACLE 11
• Créons à présent un fichier pour nos données (TableSpace):
2010/2011 ORACLE 12
• A titre de vérification, nous utilisons le script demobld qu'Oracle a fourni
pour créer une table DEPT et EMP
• Tapez:
2010/2011 ORACLE 13
• STARTUP [paramètres];
– NOMOUNT Créé la SGA et démarre les processus en arrière plan mais ne permet pas
l'accès à la base (reste un OPEN à faire).
– MOUNT Monte la base pour certaines activités DBA mais ne permet aucun accès à la
base.
– OPEN Permet aux utilisateurs d'accéder à la base.
– EXCLUSIVE Autorise l'instance courant seulement à accéder à la base.
– PFILE Spécifie le fichier d'initialisation à prendre en compte.
– FORCE Annule l'instance courante avant d'effectuer un démarrage normal.
– RESTRICT Autorise seulement l'accès aux utilisateurs avec le privilège RESTRICTED
SESSION.
– PARALLEL Serveur parallèle Oracle.
– SHARED Autre terme pour parallèle.
– RECOVER Démarre la restauration media quand la base démarre
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 14
• SHUTDOWN [paramètre];
– NORMAL Les nouvelles connexions ne sont pas permises, le serveur oracle
attend la fin de toutes les connexion.
2010/2011 ORACLE 15
• BACK_GROUND_DUMP_DEST Emplacement où les fichiers traces des processus en arrière plan sont
enregistrés.
• USER_DUMP_DEST Emplacement où les fichiers traces sont créés.
• COMPATIBLE Version du serveur avec lequel l'instance est compatible.
• CONTROL_FILES Noms des fichiers de contrôle.
• DB_BLOCK_BUFFERS Nombre de blocs mis en cache dans la SGA. La valeur par défaut et minimum est de
50 buffers.
• DB_NAME Identifiant de la base de données de 5 caractères ou moins. (seul paramètre nécessaire à la
création d'une base).
• SHARED_POOL_SIZE Taille en octets de la zone de partage. (Default : 3 500 000).
• IFILE Permet de référencer un autre fichier de paramètre à imbriquer dans la définition.
• LOG_BUFFER Nombre d'octets alloués au buffer redolog dans la SGA.
• MAX_DUMP_FILE_SIZE Taille maximum des fichiers trace, spécifiée en nombre de blocs de l'OS.
• PROCESSES Nombre de processus de l'OS pouvant se connecter simultanément à cette instance.
• SQL_TRACE Active on non l'outil de suivi SQL pour chaque session utilisateur (cf TKPROF pour exploiter les
sorties).
Docteur : Abdelalim SADIQ
• TIMED_STATISTICS Active ou non le minutage dans les fichiers trace et sur les écrans.
2010/2011 ORACLE 16
• Pour créer la base, nous allons
– créer une variable d'environnement ORACLE_SID
– créer un service
– créer le fichier de paramètres
– démarrer l'instance et la base
– créer la base
– créer les tables système
– créer une TableSpace
– vérifier la création d'une table
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 17
Docteur : Abdelalim SADIQ
TP2
2010/2011
ORACLE
18
• SQL
– LDD (Langage de description des données) : création, modification et
suppression des définitions des tables
• Fin d’instruction : ;
2010/2011 ORACLE 19
• CREATE TABLE (
Attribut1 TYPE_Att1,
Attribut2 TYPE_Att2,
…………………………….,
CONSTRAINT PK_nomTable
PRIMARY KEY (Attribut1, Attribut2,…)
CONSTRAINT FK_nomTable_attributi
FOREIGN KEY (Attributi)
REFERENCES nomTablei(Attributi),
CONSTRAINT CK_nomTable_Attributj
CHECK (condition_sur_attributj)
Docteur : Abdelalim SADIQ
);
2010/2011 ORACLE 20
• Number(n) : Entier à n (<=38) chiffres,
2010/2011 ORACLE 21
• Clé primaire :
CONSTRAINT PK_nomTable
PRIMARY KEY (Attribut1, Attribut2,…)
• Clé étrangère :
CONSTRAINT FK_nomTable_attributi
FOREIGN KEY (Attributi)
REFERENCES nomTablei(Attributi),
• Contrainte de domaine :
CONSTRAINT CK_nomTable_Attributj
CHECK (condition_sur_attributj)
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 22
• Ecrire le script des tables de la base en respectant les conditions suivants:
– Prix unitaire ne doit pas dépasser 30000DH,
2010/2011 ORACLE 23
• CLIENT (NumCli(4), Nom(15), Prénom(15), DateNaiss, Rue(20), CP(6), Ville(20))
2010/2011 ORACLE 24
CREATE TABLE CLIENT (
NumCli NUMBER(4),
Nom VARCHAR2(30),
PRENOM VARCHAR2(30),
DN DATE,
Rue VARCHAR2(100),
CP NUMBER(4),
Ville VARCHAR2(40),
CONSTRAINT PK_CLIENT PRIMARY KEY (NumCli)
);
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 25
CREATE TABLE Fournisseur(
NumFour NUMBER(4),
RaisonSoc VARCHAR2(30),
);
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 26
CREATE TABLE PRODUIT (
NumProd NUMBER(4),
Desig VARCHAR2(30),
PU NUMBER(8,3),
);
2010/2011 ORACLE 27
CREATE TABLE COMMANDE (
NumCli NUMBER(4),
NumProd NUMBER(4),
DateCDATE DEFAULT SYSDATE,
Qte NUMBER(4) NOT NULL,
CONSTRAINT PK_COMMANDE PRIMARY KEY (NumCli, NumProd, DateC),
CONSTRAINT FK_COMMANDE_NUMCLI FOREIGN KEY (NumCli)
REFERENCES Client(NumCli),
CONSTRAINT FK_COMMANDE_NUMPROD FOREIGN KEY (NumProd)
REFERENCES Produit(NumProd),
CONSTRAINT CK_COMMANDE_QTE CHECK (QTE>0)
Docteur : Abdelalim SADIQ
);
2010/2011 ORACLE 28
• Création d’index (accélération des accès)
– Syntaxe:
CREATE [UNIQYE] INDEX InomTable_attributs
ON nomTable (attribut1 *ASC|DESC+,…);
– Notes:
• UNIQUE=pas double
• ASC/DESC=ordre croissante ou décroissante
– Exemple :
CRETAE UNIQUE INDEX Iclient_NumCli ON Client (NumCli);
– Exercice: Créer un index sur l’attribut Nom de la table client.
CREATE INDEX Iclient_Nom ON Client (Nom);
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 29
• Destruction de tables:
– DROP TABLES nomTables;
• Question : est-ce que la commande « DROP TABLE
Fournisseur; » peut détruire la table Fournisseur et pourquoi?
• Réponse: Non parce que la table Produit dépend
fonctionnellement de la table Fournisseur
• Solution :
– Supprimer la table produit avant de supprimer la table fournisseur
– Supprimer la contrainte d’intégrité référentielle FK_PRODUIT_NUMFOUR de la
table Produit.
• Destruction d’un index:
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 30
• Supprimer l’index créé sur l’attribut nom de la table client,
– DROP INDEX Iclient_Nom;
2010/2011 ORACLE 31
• Afficher la définition d’une table
• DESCRIBE (ou DESC )nomTable;
• Ajout d’attributs dans une table
• ALTER TABLE nom_table ADD (attribut1 TYPE, …)
• Suppression d’attribut d’une table :
• ALTER TABLE nom_table DROP COLUMN nom_attribut;
• Modification d’attributs
• ALTER TABLE nom_table MODIFY(attribut TYPE);
• Suppression de contraintes
• ALTER TABLE nom_table DROP CONSTRAINT nom_constraint;
• Ajout de contraintes:
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 32
• Supprimer la contrainte sur la quantité dans la table
commande
2010/2011 ORACLE 33
• Ajout d’un tuple
• [WHERE condition];
• Suppression de tuples
2010/2011 ORACLE 34
CLIENT
NC Nom Prénom DN RUE CP Ville
1 Salmi Sami 12-02-1944 Rue N 17 100023 Rabat
2 IMALLA KAMEL 14-12-1974 100024 Rabat
3 SKFALLI ALI Ryue N 28 100025 Rabat
PRODUIT COMMANDE
NP DESIG PU NF NC NP DATEC QTE
10 PRO10 1100 1 1 10 12-02-2009 2
20 PRO20 2045,225 3 3 20 16-02-2009 4
Fournisseur 3 10 20-02-2009 6
Nf Raison soc 1 20 26-02-2009 3
Docteur : Abdelalim SADIQ
1 SOS SALMI
2 SOS INCONNU
3 SOS MED ALI
2010/2011 ORACLE 35
• Syntaxe :
SELECT [ALL|DISTINCT] attribut(s)
FROM table(s)
[WHERE condition(s)]
[GROUP BY attribut(s)[HAVING condition]]
[ORDER BY attribut(s)[ASC|DESC]];
• Tous les tuples
SELSECT * FROM nom_table;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 36
• EX1 : La liste de tous les clients par ordre alphabétique inverse de nom.
2010/2011 ORACLE 37
• EX4 :liste des Clients qui habitent à Rabat,
SELECT * FROM client
WHERE ville=‘RABAT’;
• Pb : Lors de l’insertion dans la table client, on ne sait pas est-ce que la ville
est écrite en majuscule, en minuscule ou les deux à la fois
• Solution :
LOWER(ch) : conversion de ch en minuscule
UPPER(ch) : conversion de ch en majuscules
2010/2011 ORACLE 39
• EX 5: Commandes en quantité au moins égale à 3
SELECT * FROM Commande
WHERE Qte>=3;
• EX 6 : Produit dont le prix unitaire est compris entre 2000 ,00 DH et
2500,00 DH
SELECT * FROM produit
WHERE PU BETWEEN 2000 AND 2500;
• EX7 : Commandes en quantité indéterminée
SELECT * FROM Commande
WHERE Qte IS NULL;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 40
• Syntaxe
– x LIKE y [ESCAPE CAR]
Expression qui retourne la valeur vraie si les deux chaîne sont égales en tenant
compte des caractères jokers de la seconde chaîne
• Les caractères jokers :
– %: ce caractère remplace n’importe quelle chaîne de caractères, même la
chaîne vide
– _: ce caractère remplace exactement un caractère.
• ESCAPE CAR : Déclare un caractère qui permet de banaliser
(désactives) l’effet de caractères jokers
• Exemple : chercher les produits qui ont comme désignation
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 41
• EX 8 : Clients habitant une ville dont le nom se termine par AT
• EX9 : Prénoms des client dont le nom est SAMI, SALAH ou ALI
SELECT prenom FROM client
2010/2011 ORACLE 42
• Elles opèrent sur un ensemble de valeurs
2010/2011 ORACLE 43
• EX 11 : Nombre total de commandes
FROM Commandes;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 44
• EX13: Liste des noms et prénoms des clients qui ont lancé des
commandes.
SELECT Nom, Prenom
FROM Client, Commande
WHERE
[Link] = [Link];
• NB : Utilisation des alias pour alléger l’écriture,
SELECT Nom, Prenom
FROM Client cli, Commande cmd
WHARE
[Link] = [Link];
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 45
• EX14: Liste des numéros, noms et prénoms des clients qui ont lancé des
commandes
SELECT [Link], Nom, Prenom
From Client cli, commande cmd
WHERE
[Link]=[Link];
• EX 15 : Liste des numéros, noms et prénoms des clients qui ont
commandé le 23/12/2008;
SELECT [Link], Nom, Prenom
FROM Client cli, Commande cmd
WHERE
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 46
• Sous- requête : C’est une requête incluse dans une expression SQL.
• Exp :
SELECT * FROM Commande
WHERE
Qte=( SELECT MAX(Qte) FROM Commande
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 47
2. La sous-requête peut ramener plusieurs valeurs. Elle est utilisée dans :
• Opération d’inclusion:
Where exp1[NOT] IN
SELECT(exp2…)
• Exp:
SELECT * FROM Client
WHERE
NumCli NOT IN (
SELECT NumCli FROM Commande
WHERE
DateC >= ’15-02-2009’
Docteur : Abdelalim SADIQ
);
2010/2011 ORACLE 48
• Opérateurs de comparaison avec (ALL et ANY):
2010/2011 ORACLE 49
3. La sous-requête peut retourner une ou plusieurs occurrences d’une liste
d’élément.
WHERE (exp 11, exp21,…) *NOT+ IN
(SELECT exp12, exp22,….)
• Note : La liste des éléments retournés par la sous-requête doit être du même
type que (exp1, exp2,…)
• Exp :
SELECT cli1.* FROM Client cli1, Commande cmd1
WHERE
[Link] = [Link] AND
([Link],[Link]) IN (SELECT [Link], [Link] From Client
Cli, Produit Prod, Commande Cmd WHERE
Docteur : Abdelalim SADIQ
[Link]=[Link] AND
[Link] = [Link] AND
NumFour = 1);
2010/2011 ORACLE 50
4. Sous-requête synchronisée avec la requête principale : La sous-requête
utilise une expression contenant au moins une colonne d’une table T de la
requête principale. Il est alors nécessaire de définir un alias de la table T.
WHERE
[Link] = [Link]);
2010/2011 ORACLE 51
5. Sous-Requête d’insertion
INSERT INTO nomTable *(att11,att21,…)+
SELECT att12, att22,…
• Exp:
-- Création d’une table nombre de commande par client
CREATE TABLE NbrCmdCli(
NumCli NUMBER(4),
NbrCmd NUMBER(3));
-- Puis insertion de données.
INSERTION INTO NbrCmdCli (NumCli)
(SELECT NumCli FROM Client);
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 52
6. Sous-Requête de Mises A Jour
UPDATE table1 alias1
SET colonne =(
SELECT …
FROM table2 alias2
WHERE
[Link]= [Link] …)
[WHERE ….+;
• Exp:
--Mettre à jour le champ NbrCmd dans la table NbrCmdCli
UPDATE NbrCmdCli NCC SET NbrCmd = (
SELECT count(*)
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 53
7. Sous-Requête de création d’une table:
CREATE TABLE nomTable *(att1, att2,…)+ AS
SELECT att11, att21,…..;
• EXP1 : Création d’une copie de la table commande
CREATE TABLE CopyCmd AS
(SELECT * FROM Commande WHERE 1 = 2 );
==> La Table CopyCmd a la même structure que la table Commande, mais
elle n’a pas les mêmes contraintes (Clé primaire, étrangère, Check, Not
Null, ….)
• EXP2: Création d’une table pleine
CREATE TABLE ClientCommande (NC,NOM, PRENOM) AS
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 55
• EX 17: Liste des clients qui ont passé au moins une commande
SELECT * FROM Client cli
WHERE
EXISTS (SELECT * FROM Commande cmd
WHERE
[Link] = [Link]);
WHERE
[Link] = [Link]);
2010/2011 ORACLE 56
• EX 19:
Numéros des client qui ont commandé au moins un produit en quantité
supérieure à chacune des quantités commandées par le client n°1.
2010/2011 ORACLE 57
• EX 20:
Numéros des clients qui ont commandé au moins un produit en quantité
supérieurs à au moins une des quantités commandées par le client n°1.
2010/2011 ORACLE 58
• EX21:
Quantité totale commandée par chaque client.
2010/2011 ORACLE 59
• EX22:
Nombre de produits différents commandés par chaque client
SELECT NumCli, COUNT (DISTINCT NumProd)
FROM Commande
GROUP BY NumCli;
• EX23:
Nombre de produits différents commandés par chaque client au moins de
février 2009
SELECT NumCli, COUNT (DISTINCT NumProd)
FROM Commande
WHERE DATEC >= ’01-02-2009’ AND
Docteur : Abdelalim SADIQ
DATEC <’01-03-2009’
GROUP BY NumCli;
2010/2011 ORACLE 60
• La clause HAVING permet de spécifier les paquets de chaque groupe à
traiter. Elle ne s’utilise qu’avec GROUP BY.
• EX 24:
• Quantité moyenne commandée pour chaque produits faisant l’objet de
plus de 3 commandes
SELECT NumProd, AVG(Qte)
FROM Commande
GROUP BY NumProd
HAVING COUNT(*)>3;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 61
UNION INTERSECTION DIFFERENCE
Requête SQL1 Requête SQL1 Requête SQL1
UNION INTERSECT MINUS
Requête SQL2 Requête SQL2 Requête SQL2
• Les deux requête SQL1 et SQL2 doivent sélectionner les mêmes attributs
(types, nombre). C.à.D:
– Si Requête SQL1 = select a1, a2 from ….et
2010/2011 ORACLE 62
• EX 25:
• Numéro des produits qui soit, ont un prix inférieur à 2000 DH, soit ont été
commandés par client N°2.
SELECT NumProd FROM Produit WHERE PU<2000
UNION
SELECT NumProd FROM Commande WHERE NumCli=2;
• EX 26:
• Numéro des client qui n’ont pas passé des commandes.
SELECT NumCli FROM Client
MINUS
SELECT distinct NumCli FROM Commande;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 63
• LENGTH(ch) : Longueur de la chaîne ch
– Exp : LONGTH (‘ALI’)=3;
• SUBSTR(ch,pos_départ_nbr_caractères): Extraction d’une portion de
chaîne ch
– Exp : SUBSTR (‘ALI’,1,2)=‘AL’ et SUBSTR (‘IL’,1,3)=‘IL’
• REPLACE(ch, sous_ch,[ch_rempl]): Remplacement d’une portion de ch par
une autre.
– Exp: REPLACE(‘SALAH’, ‘SA’,’AL’)=‘ALLAH’
– Exp: REPLACE(‘SALAH’, ‘SALA’)=‘H’
– Exp: REPLACE(‘SALAH’, ‘SaLA’)=‘SALAH’
• || ou CONCAT(ch1, ch2): Concaténation de deux chaînes
– Exp : ‘S’ || ‘AMI’ = ‘SAMI’
– Exp : CONCAT (‘S’, ‘AMI’)=‘SAMI’
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 64
• LTRIM(ch, [ensemble_de_caractères]): Supprime tout apparence des
caractères, dans l’ensemble des caractères, en début de la chaîne ch.
– Exp: LTRIM(‘YXXZALIXZY’,’XZY’)=‘ALIXZY’
– Exp: LTRIM(‘XLXYZ’,’ZXY’)=‘XL’
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 65
• LPAD(ch, n,[ch_remplissage]): Compléter, à gauche ch par ch_remplissage
pour trouver une chaîne de longueur n.
– Exp: LPAD(‘ALI’,7,’-’)=‘----ALI’
– Exp: RPAD(‘ALI’,7,’-’)=‘ALI----’
2010/2011 ORACLE 66
• INITCAP(ch): Convertit le premier caractère de chaque mot de ch en
majuscule, les autres caractères étant retournés en minuscules
– Exp : INITCAP (‘bEn YaZid’)= ‘Ben Yazid’
2010/2011 ORACLE 67
• DECODE(expression, val1, val_retournée1, val2, val_retournée2,
…,*val_défaut_retournée+)
équivalant à:
Swith éval(expression){
Val1:return(val_retournée1)
Val1:return(val_retournée1)
….
Default:
Return(val_défaut_retournée)
}
• Exemple
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 69
FONCTION DESCRIPTION
2010/2011 ORACLE 70
• MONTHS_BETWEEN ('01-SEP-95','11-JAN-94')
19.6774194
• LAST_DAY('01-SEP-95') '30-SEP-95'
2010/2011 ORACLE 71
• ROUND('25-JUL-95','MONTH') 01-AUG-95
• ROUND('25-JUL-95','YEAR') 01-JAN-96
• TRUNC('25-JUL-95','MONTH') 01-JUL-95
• TRUNC('25-JUL-95','YEAR') 01-JAN-95
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 72
• Oracle effectue automatiquement les conversions suivantes
De Vers
2010/2011 ORACLE 73
TO_NUMBER TO_DATE
TO_CHAR TO_CHAR
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 74
TO_CHAR(date, 'fmt')
• Le modèle de format :
– Doit être placé entre simples quotes et différencie les majuscules et
minuscules.
2010/2011 ORACLE 75
YYYY Année exprimée avec 4 chiffres
2010/2011 ORACLE 76
– Conversion d’une chaîne de caractères en format numérique
avec la fonction TO_NUMBER
TO_NUMBER(char)
TO_DATE(char[, 'fmt'])
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 77
• Transaction : ensemble des modifications de la base
2010/2011 ORACLE 78
Docteur : Abdelalim SADIQ
TP3
2010/2011
ORACLE
79
• Les vues sont des objets virtuels
2010/2011 ORACLE 80
• Elle peut être utilisée comme une table pour consulter ( sous
certaines conditions modifier) les données de la base.
2010/2011 ORACLE 81
• Commande de création
CREATE [OR REPLACE] VIEW nom_vue (Col1, Col2,…)
AS SELECT c 1, c2,…;
--Noms de colonnes qui seront associés en nombre et ordre aux éléments
du SELECT
• Ou
CREATE [OR REPLACE] VIEW nom_vue
AS SELECT c 1, c2,…;
-- la vue reprend les noms des colonnes ou alias de la requête
• Commande de suppression
• DROP VIEW nom_vue;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 82
• Exemple:
1. CREATE OR REPLACE VIEW LNPClients
(nomCli,PrenomCli) AS
SELECT Nom, Prenom, FROM Client;
2. CREATE OR REPLACE VIEW NbCmdClients
AS SELECT NumCli, COUNT(*)
FROM Commande
GROUP BY (NumCli) PROBLEME
2. CREATE OR REPLACE VIEW NbCmdClients
AS SELECT NumCli, COUNT(*) AS nbCMD
FROM Commande
Docteur : Abdelalim SADIQ
GROUP BY (NumCli)
2010/2011 ORACLE 83
• Exemple : Créer la vue ProdCom qui permet de manipuler que les Produits
commandés.
WHERE [Link]=[Link];
• Utilisation:
WHERE Quantite>10;
2010/2011 ORACLE 84
• Simplification de l’accès aux données en masquant les
opérations de jointure
2010/2011 ORACLE 85
• La mise à jour de données d’une table via une vue pose des problèmes et
la plupart des systèmes impose d’importantes restrictions
– Le mot clé DISTINCT doit être absent.
– La clause FROM doit faire référence à une seule table.
– La clause SELECT doit faire référence directement aux attributs de la table concernée
(pas d’attribut dérivé. Exemple SUBSTR(nom,1,3)).
– Les clauses GROUP BY et HAVING sont interdites.
• Ex.
SQL> CREATE OR REPLACE VIEW Lfour AS
SELECT DISTINCT * FROM FOURNISSEUR;
Vue créée
SQL> INSERT INTO Lfour values (7,’xxxx’);
Docteur : Abdelalim SADIQ
ERREUR à la ligne 1 :
ORA-01732: les manipulations de données sont interdites sur cette vue
2010/2011 ORACLE 86
• Ex1
Créer la vue CLIENT_RABAT à partir de la table CLIENT ne contenant que
les clients habitant à la ville de Rabat
Toutes les colonnes sont conservée et portent le même nom que les
colonnes de la table. Interroger la vue (DESC et SELECT).
• Ex2
Créer la vue PRODUIT_1 (NP_1, NumFour_1, PrixUnit_1, Desig_1) à partir
de la table PRODUIT ne contenant que les produits du fournisseur dont la
raison sociale est « SOS SALMI ».
– Vérifier la structure de la vue avec DESC
– Vérifier le contenu de la vue avec SELECT.
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 87
• Ex3
Insérer avec INSERT trois nouveaux produits dans la vue PRODUIT_1
(exemple prod50, prod60 et pror70). Tels que prod50 et prod60
appartiens au fournisseur dont la raison sociale est « SOS SALMI » et
prod70 à un autre fournisseur.
– Vérifier le contenu de la vue et celui la table PRODUIT. Conclure ?
– Supprimer ensuite les enregistrements ajoutées dans la table PRODUIT (par
l’intermédiaire de la vue PRODUIT_1). Conclure ?
• EX4
Afficher la liste des vues déjà créées pat les commandes suivantes:
SELECT VIEW_NAME, TEXT_LENGTH, TEXT FROM USER_VIEWS
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 88
• EX5
Créer la vue CLIENT_CMD (NCLI, NOMPRENOM, ADR, REFCMD, MHT,
MTVA, MTTC, DATEC) permettant d’avoir la liste des clients qui ont
commandé.
– Vérifier la structure de la vue avec DESC
– Vérifier le contenu de la vue avec SELECT.
– Afficher la liste des clients qui ont commandé au cours du mois de février 2009.
– Essayer de mettre à jour la vue CLIENT_CMD. Conclure ?
• EX6
• Créer la vue CLIENT_NBCMD (NCLI, NOM, PRENOM, ADR, NBRCMD)
permettant d’avoir le nombre de commande pour chaque client.
– Vérifier la structure de la vue avec DESC
– Vérifier le contenu de la vue avec SELECT.
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 89
Docteur : Abdelalim SADIQ
TP4
2010/2011
ORACLE
90
• Transmission de privilèges
GRANT privilège ON table|vue
TO user|PUBLIC [WITH GRANT OPTION];
Privilèges :
SELECT : lecture INSERT : insertion
UPDATE : mise à jour DELETE : suppression
ALL : tous les privilèges ALTER : destruction
INDEX : construction d’index
• Suppression de privilèges
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 91
• Contient sous forme relationnelle la définition de tous les objets créés par
le système et les usagers.
• Ces tables sont accessibles avec SQL (en mode consultation uniquement).
2010/2011 ORACLE 92
Exemples
WHERE COLUMN_NAME=‘Intitule’;
WHERE TABLE_NAME=‘Client’;
WHERE OWNER=‘darmont’;
2010/2011 ORACLE 93
Docteur : Abdelalim SADIQ
TP5
2010/2011
ORACLE
94
• PL/SQL : Langage procédural
Extension de SQL
• Définition de sous-programmes
2010/2011 ORACLE 95
DECLARE
--Déclaration constantes/variables
BEGIN
--Commandes/instructions
EXCEPTION
--Traitement des erreurs à l’exé.
END;
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 96
Partie déclarative d’un bloc PL/SQL ou d’un sous-programme
• Syntaxe:
• Identifiant [CONSTANT] Type_données [NOT NULL] [:=|DEFAULT expr];
• Règle de dénomination:
– Préfixer les noms des variables par « v_ » exp: v_dn
– Préfixer les noms des constantes par « c_ » exp: c_ttva
• Types usuels :
INTEGER, REAL, STRING, DATE, BOOLEAN + types SQL(NUMBER,
VARCHAR2…)
• Variables:
V_dn DATE;
compt INTEGER:=0; -- Valeur par défaut
Docteur : Abdelalim SADIQ
2010/2011 ORACLE 97
• Constantes
– c_pi CONSTANT REAL:=3.14;
– c_ttva CONSTANT REAL DEFAULT 0.19;
• Type d’une colonne d’une table
– Syntaxe:
nom_var nom_table.nom_colonne%TYPE;
– EX: v_nom [Link]%TYPE;
• Type d’une autre variable
v_credit REAL;
v_debit credit%TYPE;
• Type d’un tuple d’une table
– Syntaxe:
Docteur : Abdelalim SADIQ
Nom_var nom_table%ROWTYPE;
– Ex: v_client client%ROWTYPE;
2010/2011 ORACLE 98
• Tableaux : 1) Déclaration d’un type tableau
2) Déclaration d’une variable de ce type
• Syntaxe :
TYPE nom_type IS TABLE OF type éléments
INDEX BY BINARY_INTEGER L’option INDEX BY BINARY_INTEGER
est facultative depuis la version 8 de
ex. TYPE Tab_entiers TABLE OF INTEGER PL/SQL. Si elle est omise, le type
INDEX BY BINARY_INTEGER; déclaré est considéré comme une
TYPE Tab_cli TABLE OF [Link]%TYPE nested table (extension objet). Si elle
est présente, l’indexation ne
INDEX BY BINARY_INTEGER; commence pas nécessairement à 1 et
1. Déclaration d’une variable de ce type peut être même négative (l’intervalle
v_entier Tab_entiers; de valeurs du type BINARY_INTEGER
va de – 2 147 483 647 à 2 147 483
v_client Tab_cli; 647).
2. Utilisation
Docteur : Abdelalim SADIQ
v_nomClient(1):=‘ALI’;
v_entiers(-1):=-10;
2010/2011 ORACLE 99
SET SERVEROUTPUT ON END LOOP;
DECLARE k := t ( 1 0 ) ;
TYPE numberTab IS VARRAY (10) FOR i in REVERSE 2 . . 1 0 LOOP
OF NUMBER; t ( i ) := t ( i - 1 ) ;
t numberTab ; END LOOP;
i number ; t ( 1 ) := k ;
k number ; FOR i IN 1 . . 1 0 LOOP
BEGIN DBMS_OUTPUT.PUT_LINE( t ( i )
t := numberTab ( ) ; );
t .EXTEND( 1 0 ) ; END LOOP;
FOR i IN 1 . . 1 0 LOOP END;
Docteur : Abdelalim SADIQ
t ( i ) := i ; /
V_four.num:=4;
V_four.desc:=‘fournisseur matériels informatique’;
Valide
Invalide car une variable NOT NULL doit être initialisé à sa création,
– v_valide BOONEAN := 1;
Docteur : Abdelalim SADIQ
ex.
v_fournisseur.numero := 4589;
v_fournisseur.raison_sociale := ‘COGIP’;
INTO v_fournisseur
FROM fournisseur
Docteur : Abdelalim SADIQ
WHERE numfour=4589;
IF condition1 THEN
Exemple:
-- Instructions IF MOD(i,5)=5 THEN
ELSEIF condition2 THEN v_qte:=5;
v_qte:=i;
END IF; END IF;
Ou
<<nom_étiquette>>
-- Saut inconditionnel
GOTO étiquette;
-- Sortie de boucle
• Déclaration :
CURSOR nom_curs IS requête;
ex. CURSOR calcul IS
SELECT numprod, pu*1.206 pTTC
FROM produit
ORDER BY NumProd;
Tuple calcul%ROWTYPE.
Docteur : Abdelalim SADIQ
END LOOP
DECLARE
nbp NUMBER(3);
aucun_produit EXCEPTION;
CURSOR calcul IS
FROM produit;
Docteur : Abdelalim SADIQ
tuple calcul%ROWTYPE;
END;
v_compt := v_compt+1 ;
END LOOP ;
DBMS_OUTPUT.PUT_LINE ( ‘La somme est : ‘||TO_CHAR(v_som) ) ;
END;
Faites de sorte que les scripts important les données des tables CLIENT
vers la table person ne puissent être exécutes qu'une seule fois.
• Ex 11
• EX19
Ecrire une procédure qui affiche tous les clients, et pour chaque client, la
liste des comptes, et pour chacun de ces comptes, l'historique des
opérations.
Docteur : Abdelalim SADIQ
2010/2011
ORACLE
130
• Trigger (déclencheur) : routine déclenchée automatiquement
par des événements liés à des actions sur la base
– BEFORE|AFTER
– INSERT|DELETE|UPDATE
– ON nom_table
– -- traitement à effectuer
• Variables spécifiques
Docteur : Abdelalim SADIQ
valeur!’);
END;
9. Il ne doit être possible de modifier effecMax que si des étudiants ne se retrouvent pas avec une
inscription invalidée.