SGBD Prof Part2
SGBD Prof Part2
SGBD Prof Part2
SGBD
Vues et Squences
Le langage PLSQL
PL SQL
P ti 2
Partie2
FacultdesSciencesdeMonastir
LFI2
LCD:Dfinition(1)
Dfinition :
Lelangagedecontrlede
Le
langage de contrle de
donnes (LCD)
donnes(LCD)
LCD:Dfinition(2)
LCD:GRANT(1)
LCD:GRANT(2)
LCD:GRANT(3)
p
g
peutluimmel'accorderunautre.
Exemple:
GRANT ALL PRIVILEGES
ON VOITURE
TO Martin
M ti
WITH GRANT OPTION;
LCD:GRANT(3)
LCD:GRANT(4)
10
LCD:GRANT(5)
LCD:REVOKE(1)
Syntaxe:
REVOKE ALL PRIVILEGES | accs_spcifique
accs spcifique
ON nom_table | nom_vue
GRANT INSERT
ON PERSONNE
TO PUBLIC;
12
LCD:REVOKE(2)
LCD:Lecontrledintgrit
Exemples :
REVOKE SELECT,
SELECT UPDATE
ON VOITURE, ACHAT
FROM Smith;
ON VOITURE
FROM Martin;
14
LCD:COMMIT(1)
LCD:COMMIT(2)
LCD:ROLLBACK
LCD:SAVEPOINT
17
18
LCD:Terminaisond'unetransaction
Vuesetsquences
19
Vues:Dfinition(1)
Vues:Exemples(1)
Dfinition :
Exemples :
Syntaxe :
CREATE VIEW nom_de_la_vue
AS SELECT *
FROM VOITURE
WHERE Prix > 15 000;
AS <clause
l
SELECT>;
FROM VOITURES_CHERES;
Vues:Exemples(2)
CREATE
VIEW
marquee voiture) AS
marquee_voiture)
VOITURES_PUISSANTES
22
Vues:Exemples(3)
(immat_voiture,
Vues:Supression
Squences:Dfinition
25
26
Squences:Cration(1)
Squences:Cration(2)
Syntaxe:
CREATE SEQUENCE nom_de_la_sequence
nom de la sequence
[START WITH valeur_initiale]
[INCREMENT BY ] incrment
[NOMAXVALUE NOMINVALUE | MAXVALUE maximum | MINVALUE
minimum]
i i
]
[NOCYCLE | CYCLE]
[CACHE nombre_de_valeurs];
STARTWITHpermetdefixerlavaleurinitialedelasquence.
INCREMENTBYpermetdefixerlepasdincrmentation.Si
celuiciestpositif,lasquenceestcroissante,sinonelledcrot.
l i i
i if l
i
i
ll d
27
NOMAXVALUEetNOMMINVALUEpermetdenepasfixerde
limite dans la squence Si lon
limitedanslasquence.Sil
ondsirefixerunplafondnepas
dsire fixer un plafond ne pas
dpasser(pourunesquenceascendante),onutilise
MAXVALUE.Silondsirefixerunplancher(pourunesquence
descendante),onutiliseMINVALUE.
LoptionCYCLEpermetunefoislalimiteducompteuratteint,
dereprendrelecomptagelavaleurMINVALUE(pourune
squenceascendante)ouMAXVALUE(pourunesuite
descendante) Si lon
descendante).Sil
ondsirearrterlasquenceunefoisla
dsire arrter la squence une fois la
limiteducompteuratteint,ilsuffitdutiliserloptionNOCYCLE.
LLoption
optionCACHEpermetdemettrenombre_de_valeurs
CACHE permet de mettre nombre de valeurs valeurs
valeurs
danslammoirecacheafindoptimiserlutilisationdes
squencesetavoiruneffetsignificatifsurlesperformances,
surtoutlorsquenombre_de_valeurs estlev.
28
Squences:Exemples(1)
Squences:Exemples(2)
INCREMENT BY 3;
START WITH 5
INCREMENT BY 3
MAXVALUE 30;
Cette commande
d
SQL permet de
d
crer
une squence
29
Squences:Exemples(3)
30
Squences:Interrogation
L'interrogation d'une squence se fait par l'utilisation des "pseudo
colonnes" CURRVAL et NEXTVAL.
colonnes
NEXTVAL On parle de pseudo
pseudocolonne
colonne car
cela se manipule un peu comme une colonne de table, mais ce
n'est pas une colonne de table.
LapseudocolonneCURRVALretournelavaleurcourantedela
squence.
LapseudocolonneNEXTVALincrmentelasquenceet
retournelanouvellevaleur.
SELECT SEQUENCE
Q
_VOITURE.CURRVAL FROM DUAL;;
Lors de la premire utilisation dun squence, il faut utiliser
NEXTVAL pour llinitialiser.
initialiser. Ensuite, CURRVAL permet d
dobtenir
obtenir la
valeur courante de la squence.
32
Squences:Modification
Squences:Colonneautoincrmente
Syntaxe:
ALTER SEQUENCE nom_de_la_sequence
nom de la sequence
[INCREMENT BY incrment]
[NOMAXVALUE NOMINVALUE | MAXVALUE maximum | MINVALUE
minimum]
[NOCYCLE | CYCLE]
[CACHE nombre_de_valeurs];
Exemple :
END;
C
Cett exemple
l ne gre
pas le
l contrle
t l d'unicit
d' i it de
d la
l valeur
l
que l'on
l' va
insrer, mais si le champ n'est aliment QUE par l'utilisation de la
squence qui lui est ddie, et si cette squence n'est pas paramtre
pour reboucler,
reboucler il n
n'yy a pas de raison qu
qu'une
une erreur de cl en double
surgisse...
33
34
INCREMENT BY 3;
PL/SQL:Introduction(1)
PL/SQL:Introduction(2)
35
36
PL/SQL:Introduction(3)
PL/SQL:OrdresSQLsupports
37
38
PL/SQL:Blocsetsections(1)
PL/SQL:Blocsetsections(2)
La section 'EXCEPTION',
EXCEPTION , quand elle est prsente, est
incluse dans la section et NON PAS la suite de celle ci.
BEGIN
mes ordres
d SQL ett PL/SQL
EXCEPTION
mon traitement des exceptions
NULL;
END;
END
39
40
PL/SQL:Blocsetsections(3)
PL/SQL:Blocsetsections(4)
Afin de pouvoir utiliser une exception, il faut tout dabord dclarer une
variable dexception dans la partie DECLARE (ex : DECLARE erreur
EXCEPTION;).
Ensuite, dans la partie entre le BEGIN et le END, pour appeler une
exception et stopper le bloc PL/SQL,
PL/SQL on utilise la commande RAISE
nom_exception (ex : RAISE erreur;). Cette commande stoppe le bloc
PL/SQL et va dans la partie EXCEPTION.
Dans cette partie, pour afficher un message derreur, on utilise la
commande suivante :
WHEN nom_exception THEN
l
d l
ili
numrodoittrecomprisentre20000et20999.
message:chanedecaractresdunelongueurmaximalede2048
g
g
octetsquicontientlemessageassocilerreur.
41
42
PL/SQL:Procduresstockes(1)
PL/SQL:Procduresstockes(2)
Ce code est une commande SQL, qui cre la procdure PL/SQL, et donc
compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et
le END,
END en le rfrenant par nom_de_procdure.
nom de procdure Et pour excuter cette
procdure de manire autonome, on utilise la commande : EXECUTE
nom_de_procdure. Les paramtres dentre doivent tre dclars (nom
et type).
type)
IS
BEGIN
mes ordres SQL et PL/SQL
EXCEPTION
mon traitement des exceptions
END;
43
44
PL/SQL:Fonctionsstockes(1)
PL/SQL:Fonctionsstockes(2)
Ce code est une commande SQL, qui cre la fonction PL/SQL, et donc
compile et stocke dans la base le bloc PL/SQL compris entre le BEGIN et
le END,
END en le rfrenant par nom_de_fonction.
nom de fonction La valeur retourne en
sortie correspond la variable_de_sortie dont le type est type_de_sortie.
Les paramtres dentre doivent tre dclars (nom et type).
IS
BEGIN
BEGIN
SELECT solde
l INTO le_solde
l
l
EXCEPTION
FROM clients
WHERE numclient
li
= numero;
END;
RETURN le_solde;
END;
END
45
46
PL/SQL:Fonctionsstockes(3)
PL/SQL:Triggers(1)
C
Cette commande
d permet de
d crer
une fonction
f
i nomme
solde,
ld
dont le paramtre dentre est le numro de client. La fonction
permet de retourner en sortie,
sortie dans la variable relle le_solde,
le solde le
solde du compte du client identifi par numero. Pour appeler cette
fonction et utiliser son rsultat au sein dun ordre SQL, il suffit
dexcuter la commande suivante : SELECT solde(1000) FROM
DUAL.
47
48
PL/SQL:Triggers(2)
PL/SQL:Triggers(3)
49
50
PL/SQL:Triggers(4)
PL/SQL:Triggers(5)
ALTER TABLE
nom_table { ENABLE | DISABLE } TRIGGER
{ ALL | nom_trigger1 [,,nom_triggerN]};
51
52
PL/SQL:Triggers(6)
PL/SQL:Triggers(7)
53
PL/SQL:Triggers(8)
54
PL/SQL:Triggers(9)
Cette commande SQL permet de crer deux tables TABLE_1 et TABLE_2 puis
cre un dclencheur qui insre un enregistrement llintrieur
intrieur de la Table_2
Table 2
lorsquune opration dinsertion sest accomplie dans Table_2. Le
dclencheur vrifie si le nouvel enregistrement possde un premier
composant
p
infrieur ou gal
g 10 et si c'est le cas,, inverse les
enregistrements l'intrieur de TABLE_2. Les variables spciales NEW et
OLD sont disponibles pour se rfrer respectivement des nouveaux ou
d'anciens enregistrements. Les deux points (:) prcdent NEW et OLD dans
VALUES sont dans ce cas obligatoires, par contre dans la clause
conditionnelle WHERE , ils doivent tre omis
55
56
PL/SQL:Curseurs(1)
PL/SQL:Curseurs(2)
57
58
PL/SQL:Curseurs(3)
PL/SQL:Curseurs(4)
59
60
PL/SQL:Curseurs(5)
PL/SQL:Langage(1)
Dclaration, initialisation des variables
Identificateurs Oracle :
30caractresauplus
p
commenceparunelettre
peutcontenirlettres,chiffres,_,$et#
peut contenir lettres chiffres $ et #
passensiblelacasse
Portehabituelledeslangagesblocs
Doiventtredclaresavantdtreutilises
61
PL/SQL:Langage(2)
62
PL/SQL:Langage(3)
Initialisation de variables
Dclaration
D l ti ett initialisation
i iti li ti
n :=
DirectiveINTOdelarequteSELECT
Di ti INTO d l
t SELECT
Nom_variable := valeur;;
Dclaration multiple interdite
Exemples :
dateNaissance :=
to_date(10/10/2004,DD/MM/YYYY);
( / /
, /
/
);
SELECTnomINTOv_nom FROMemp WHEREmatr =
509;
509;
Exemples :
age integer;
nomvarchar(30);
nom varchar(30)
dateNaissance date;
okboolean
kb l
:=true;
t
63
64
PL/SQL:Langage(4)
PL/SQL:Langage(5)
SELECT INTO
Le type de variables
VARCHAR2
Longueurmaximale:32767octets
g
Syntaxe:Nom_variable VARCHAR2(30);
Exemple:nameVARCHAR2(30);nameVARCHAR2(30)
Exemple: name VARCHAR2(30); name VARCHAR2(30)
:=toto;
NUMBER(long,dec)
Long:longueurmaximale
Dec :longueurdelapartiedcimale
Exemple:num_tel
Exemple: num tel number(10);toto
number(10); toto
number(5,2)=142.12;
65
66
PL/SQL:Langage(6)
PL/SQL:Langage(7)
Le type de variables
Le type de variables
VARCHAR2
Longueurmaximale:32767octets
g
Syntaxe:Nom_variable VARCHAR2(30);
Exemple:nameVARCHAR2(30);nameVARCHAR2(30)
Exemple: name VARCHAR2(30); name VARCHAR2(30)
:=toto;
DATE
PardfautDDMONYY(18DEC02)
(
)
FonctionTO_DATE
Exemple:start_date
Exemple: start date :=to_date(
:= to date(29
29SEP2003
SEP 2003DD
, DD
MONYYYY);start_date :=to_date(29SEP
2003:13:01DD
2003:13:01
, DDMONYYYY:HH24:MI
MON YYYY:HH24:MI);
);
NUMBER(long,dec)
Long:longueurmaximale
Dec :longueurdelapartiedcimale
Exemple:num_tel
Exemple: num tel number(10);toto
number(10); toto
number(5,2)=142.12;
BOOLEAN
TRUE
FALSE
FALSE
NULL
67
68
PL/SQL:Langage(8)
PL/SQL:Langage(9)
Exemple dutilisation
DECLARE
BEGIN
v_employe emp%ROWTYPE;
v_nom emp.nom%TYPE;
SELECT * INTO v_employe FROM emp WHERE matr = 900;
v nom := v_employe.nom;
v_nom
v employe nom;
v_employe.dept := 20;
69
70
PL/SQL:Langage(10)
PL/SQL:Langage(11)
Test conditionnel
Test conditionnel
IFTHEN
IF THEN
IFTHENELSIF
IF v_nom
_
= PAKER THEN
END IF;
ELSIF v_nom
v nom = ASTROFF
ASTROFF THEN
IFTHENELSE
IF v_date
v date > 11
11-APR-03
APR 03 THEN
END IF;
72
PL/SQL:Langage(12)
PL/SQL:Langage(13)
Test conditionnel
Les boucles
CASE
LOOP
CASE
WHEN
WHEN
ELSE
END;
instructions excutables;
slecteur
expression1 THEN rsultat1
expression2 THEN rsultat2
rsultat3
s ltat3
Exemple
E
l
val := CASE city
WHEN TORONTO THEN RAPTORS
instructions excutables;
ELSE NO TEAM
END LOOP;
END;
73
74
PL/SQL:Langage(14)
PL/SQL:Langage(15)
Les boucles
Affichage
LOOP
instructions;
END LOOP;
Affichage
dbms_output.put_line(chane);
Utiliser||pourfaireuneconcatnation
Utili ||
f i
t ti
On
O pourra galement
l
t utiliser
tili un curseur dans
d
l clause
la
l
IN
IN.
75
76
PL/SQL:Langage(16)
PL/SQL:Langage(17)
Exemple
Exemple
DECLARE
DECLARE
nb integer;
i number(2);
BEGIN
BEGIN
nb
b := sql%rowcount;
l%
t
dbms_output.put_line(Nombre : || i );
END LOOP;
END;
END;
77
78
PL/SQL:Langage(18)
PL/SQL:Langage(19)
Exemple
Exemple
DECLARE
DECLARE
compteur number(3);
compteur number(3);
i number(3);
i number(3);
BEGIN
BEGIN
select
l
count(*)
(*) into
i
compteur from
f
clients;
li
select
l
count(*)
(*) into
i
compteur from
f
clients;
li
dbms_output.put_line('Nombre : ' || i );
dbms_output.put_line('Nombre : ' || i );
END LOOP;
END LOOP;
END;
END;
79
80
PL/SQL:Applications(1)
PL/SQL:Applications(2)
Exercice 1:
81
82
AVION (AvNum,
(AvNum AvNom,Capacite,
AvNom Capacite Localisation)
PILOTE ((PlNum,, PlNom,, PlPrenom,, Ville,, Salaire))
PL/SQL:Applications(3)
PL/SQL:Applications(4)
Solution:
Exercice 2:
DECLARE
C
CURSOR avamodif IS
SELECT VolNum,
V lN
A N
AvNum,
H
HeureDep,
D
H
HeureArr
A
FROM VOL WHERE
AvNum IN (1,2,4,8);
volmod avamodif%ROWTYPE;
Tvol REAL;
BEGIN
Supprimer
S
i
un Pilote
Pil
|| a
Modifier un Pilote
Compter les Pilotes
END LOOP;
END
83
84
PL/SQL:Applications(5)
Solution:
CREATE OR REPLACE PACKAGE Pilotes AS
CURSOR les_pilotes RETURN PilNuplet IS SELECT FROM PILOTE;
PROCEDURE afficher IS
t PilNuplet;
BEGIN
FOR t IN les_p
pilotes LOOP
DBMS_OUTPUT.put_line (t.num || || t.prenom || || t. nom);
END LOOP
END;
Procedure ajouter (num,
(num INTEGER,
INTEGER nom VARCHAR,
VARCHAR prenom VARCHAR) IS
BEGIN
85