Vous êtes sur la page 1sur 99

Partie I: langage de

dfinition de donnes
Pr: E. Saad

15/12/2014

Langage de dfinition des Donnes


Un ordre du LDD permet de crer , de supprimer et de modifier la
structure dune base de donnes relationnelle; les objets que le
LDD peut grer sont:

Table
Vue
Squence
Index
Synonyme
15/12/2014

Cration de Tables
Syntaxe :
CREATE TABLE nomtable
(champs typechamps [DEFAULT valeur], ...);
CREATE TABLE nomtable
[(champs1, champs2...)] as sousinterrogation;

Les identificateurs utiliss doivent respecter les rgles suivantes:


Commencer par une lettre et contenir que les caractres A
Z, 0 9, _, $, et # (30 caractres maximum).
tre diffrent des autres objets appartenant au mme
utilisateur et des mots rserv Oracle

15/12/2014

Cration de Tables
Types de donnes

Description

VARCHAR2(taille)

Donnes caractres de longueur variable


(2000 caractres maximum)

CHAR(taille)
caractres maximum)

Donnes caractres de longueur fixe (255

NUMBER(taille,dcimale)

Numrique de longueur variable

DATE

Valeurs de date et d'heure

LONG

Donnes caractres de longueur variable,


jusqu' 2 giga-octets

LONG RAW

Binaire(image)

15/12/2014

Cration de Tables
CREATE TABLE dept
( deptno NUMBER(2),
dname VARCHAR2(15),

loc VARCHAR2(12));

CREATE TABLE

Empclerk

AS SELECT empno mat, ename, nom, sal + comm as salaire,

hiredate, deptno
FROM emp
WHERE job like 'clerk');

15/12/2014

Modification de la structure dune Tables


L'ordre ALTER TABLE permet dajouter de nouveau champs ou de
modifier des champs existants.
Syntaxe :
ALTER TABLE Nomtable
ADD
(champs typechamps [DEFAULT valeur]
[, champs typechamps]...);
ALTER TABLE Nomtable
MODIFY
(champs typechamps [DEFAULT valeur]
[, champs typechamps]...);

ALTER TABLE Nomtable


DROP COLUMN champs ;
ALTER TABLE table
RENAME COLUMN ancien_nom TO nouveau_nom

15/12/2014

Gestion des tables


Supprimer une Table
DROP TABLE Nomtable;

Renommer une Table


RENAME AncienNomTable TO NouveauNomTable;

Vider une Table


TRUNCATE TABLE NomTable;

15/12/2014

Les Contraintes dintgrits

Les types de contraintes reconnues dans SQL sont:

NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK

15/12/2014

Les Contraintes dintgrits


Syntaxe :
CREATE TABLE [Schema.]NomTable
(Champs TypeChamps [DEFAULT Valeur]

[[CONSTRAINT NomContrainte] TypeContrainte],


,
[[CONSTRAINT NomContrainte] TypeContrainte(Champs, ...),]
);

ALTER TABLE NomTable


ADD [CONSTRAINT NomContrainte] TypeContrainte(Champs);

15/12/2014

Les Contraintes dintgrits


CREATE TABLE Employes(

empno NUMBER(4) PRIMARY KEY, ename VARCHAR2(15) NOT NULL,


job VARCHAR2(10), mgr NUMBER(4), hiredate DATE, sal NUMBER(8,2),
comm NUMBER(8,2), deptno NUMBER(2) NOT NULL ,
CONSTRAINT un_dept UNIQUE (ename) );
ALTER TABLE Employes
ADD CONSTRAINT Emp_Dept_Fk FOREIGN KEY (deptno)
REFERENCES dept (deptno) ON DELETE CASCADE;

ALTER TABLE Employes


ADD CONSTRAINT CONSTRAINT CHECK (Comm > 0);
15/12/2014

Gestion des contraintes


Supprimer une contrainte
ALTER TABLE NomTable
DROP CONSTRAINT

NomContrainte [CASCADE];

Dsactiver une Contraintes


ALTER TABLE

NomTable

DISABLE CONSTRAINT

NomContrainte [CASCADE];

Activer une Contraintes


ALTER TABLE

NomTable

ENABLE CONSTRAINT

NomContrainte [CASCADE];

15/12/2014

Partie II: langage de


manipulation de donnes
Pr: E. Saad

15/12/2014

Aspect gnrale du langage SQL


Le langage SQL ( Structured Query Longage : Langage
dinterrogation structur) , li la structure relationnelle des BD,
est un langage non procdural, il comporte plusieurs commandes

qui se repartissent en trois familles fonctionnellement distinctes:

Langage

de manipulation des donnes (LMD): slectionner,

insrer, modifier, ou supprimer des donnes dans une table.

Langage de dfinition des donnes(LDD): crer des tables dans


une BDR, ainsi den modifier ou de supprimer leur structure.

Langage de contrle de donnes(LCD): grer la scurit et les


permissions au niveau des utilisateurs dune BDR.
15/12/2014

Tables utilises dans le Cours


Table Emp

Table Dept

Table SALGRADE

15/12/2014

Lordre Select
Lutilisation la plus frquente de SQL seffectue dans les requtes
afin de rechercher les donnes dans une base de donnes.
Syntaxe
select [distinct] * | <liste des champs >
From <Liste des tables>
[where <critre de slection >]
[group by <critres de regroupement>]
[having <conditions de filtrage sur les groupes>]

[order by <liste des champs > asc | desc ] ;


15/12/2014

criture des Ordres SQL


Les

ordres SQL peuvent tre crits indiffremment en

majuscules et/ou minuscules.

Les ordres SQL peuvent tre crits sur plusieurs lignes.


Les mots-cls ne doivent pas tre abrgs ni scinds sur deux
lignes diffrentes.

Les

clauses sont gnralement places sur des lignes

distinctes.

15/12/2014

Exemple de SELECT
SELECT *
FROM
dept;
DEPTNO
--------10
20
30
40

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

SELECT deptno, loc


FROM
dept;
DEPTNO
--------10
20
30
40
15/12/2014

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON

Exemple de SELECT

SELECT *
FROM
dept;

DEPTNO
--------10
20
30
40

DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS

SELECT deptno
FROM
emp;

DEPTNO
--------10
30
10
20
...
14 rows selected.
15/12/2014

LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
SELECT DISTINCT deptno
FROM
emp;
DEPTNO
--------10
20
30

LAlias
de
Colonne
Permet de renommer un en-tte de colonne (champs)
Suit immdiatement le nom de la colonne ; le mot-cl AS peut
tre plac entre le nom et lalias est optionnel

Doit

obligatoirement tre inclus entre guillemets (") sil

contient des espaces, des caractres spciaux ou si les


majuscules/minuscules doivent tre diffrencies
SELECT ename AS name, sal salary
FROM
emp;

15/12/2014

Le
littral
Un littral est un caractre, une expression, ou un nombre
inclus dans la liste SELECT.

Les

valeurs littrales de type date et caractre doivent tre

places entre simples quotes (').


SELECT ename, job, deptno
FROM
emp
WHERE job='CLERK';
ENAME
---------JAMES
SMITH
ADAMS
MILLER
15/12/2014

JOB
DEPTNO
--------- --------CLERK
30
CLERK
20
CLERK
20
CLERK
10

Les oprateurs

15/12/2014

Utilisation
des Oprateurs
ename, sal

SELECT
FROM
WHERE

emp
sal BETWEEN 1000 AND 1500;

ENAME
SAL
---------- --------MARTIN
1250
TURNER
1500
WARD
1250
ADAMS
1100
MILLER
1300

SELECT
FROM
WHERE

Limite

infrieure

suprieure

empno, ename, sal, mgr


emp
mgr IN (7902, 7566, 7788);

EMPNO
--------7902
7369
7788
7876
15/12/2014

Limite

ENAME
SAL
MGR
---------- --------- --------FORD
3000
7566
SMITH
800
7902
SCOTT
3000
7566
ADAMS
1100
7788

Utilisation des Oprateurs de


Comparaison
SELECT
FROM
WHERE

ename
emp
ename LIKE 'S%';

SELECT
FROM
WHERE

ename
emp
ename LIKE '_A%';

ENAME
---------JAMES
WARD

15/12/2014

Utilisation des Oprateurs logiques


...
...
...
...

WHERE
WHERE
WHERE
WHERE

...
...
...
...

NOT BETWEEN ... AND


IS NOT IN ...
NOT LIKE ...
IS NOT NULL

...

SELECT ename, job


FROM
emp
WHERE job NOT IN ('CLERK','MANAGER','ANALYST');
ENAME
---------KING
MARTIN
ALLEN
TURNER
WARD

15/12/2014

JOB
--------PRESIDENT
SALESMAN
SALESMAN
SALESMAN
SALESMAN

Fonction de regroupement de donnes


Les fonctions de groupe agissent sur des groupes de lignes et

donnent un rsultat par groupe

AVG ([DISTINCT|ALL]n)
COUNT ({ *|[DISTINCT|ALL]expr})
MAX ([DISTINCT|ALL]expr)
MIN ([DISTINCT|ALL]expr)
SUM ([DISTINCT|ALL]n)
15/12/2014

Utilisation des fonctions de


regroupement

SELECT AVG(sal), MAX(sal), MIN(sal), SUM(sal)


FROM emp
WHERE
job LIKE 'SALES%';
AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL)
-------- --------- --------- --------1400
1600
1250
5600
SELECT
FROM emp
WHERE
COUNT(*)
--------6

15/12/2014

COUNT(*)
deptno = 30;

Utilisation des fonctions de


regroupement

SELECT AVG(comm)
FROM
emp;
AVG(COMM)
--------550

SELECT AVG(NVL(comm,0))
FROM
emp;
AVG(NVL(COMM,0))
---------------157.14286

15/12/2014

Cration
de
Groupes
de
Donnes
DEPTNO
SAL

EMP

--------- --------10
2450
10
5000
10
1300
20
800
20
1100
20
3000
20
3000
20
2975
30
1600
30
2850
30
1250
30
950
30
1500
30
1250
SELECT
deptno, AVG(sal)
FROM
emp
GROUP BY deptno;
15/12/2014

2916.6667

"salaire
moyen pour
chaque
2175
dpartement
de la table
EMP"
1566.6667

DEPTNO AVG(SAL)
------- --------10 2916.6667
20
2175

30 1566.6667

Exemple de cration de groupes de


donnes
SELECT
deptno, job, sum(sal)
FROM
emp
GROUP BY deptno, job;
DEPTNO JOB
SUM(SAL)
--------- --------- --------10 CLERK
1300
10 MANAGER
2450
10 PRESIDENT
5000
20 ANALYST
6000
20 CLERK
1900
...
9 rows selected.

15/12/2014

Imbrication des Fonctions de Groupe


SELECT
max(avg(sal))
FROM
emp
GROUP BY deptno;

MAX(AVG(SAL))
------------2916.6667

15/12/2014

Utilisation de la clause HAVING


La clause HAVING permet restreindre les groupes

Les lignes sont regroupes.


La fonction de groupe est applique.

Les

groupes qui correspondent la clause HAVING sont

affichs.

15/12/2014

Exemple de lutilisation de HAVING


SELECT
FROM
GROUP BY
HAVING

deptno, max(sal)
emp
deptno
max(sal)>2900;

DEPTNO MAX(SAL)
--------- --------10
5000
20
3000

15/12/2014

Exemple de lutilisation de HAVING


SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

job, SUM(sal) PAYROLL


emp
job NOT LIKE 'SALES%'
job
SUM(sal)>5000
SUM(sal);

JOB
PAYROLL
--------- --------ANALYST
6000
MANAGER
8275

15/12/2014

Les Sous-Interrogations
Syntaxe
SELECT select_list
FROM tables
WHERE expr operator (SELECT select_list FROM tables )
;

La sous-interrogation (requte interne) est excute une fois


avant la requte principale (une sous-interrogation ne doit
pas contenir la clause ORDER BY).

Le rsultat de la sous-interrogation est utilis par la requte


principale (externe).
15/12/2014

Types de Sous-Interrogations
Sous-interrogation
mono-ligne

Oprateurs mono-ligne

15/12/2014

Sous-interrogation
multi-ligne

Oprateurs multi-ligne

Exemple de Sous-Interrogations monoligne


SELECT
FROM
WHERE

AND

ename, job
emp
job =
(SELECT
FROM
WHERE
sal >
(SELECT
FROM
WHERE

ENAME
JOB
---------- --------MILLER
CLERK

15/12/2014

CLERK

job
emp
ename = 'ADAMS')
1100

sal
emp
ename = 'ADAMS');

Exemple de Sous-Interrogations monoSELECT


ename, job, sal ligne
FROM
WHERE

emp
sal =
(SELECT
FROM

800

MIN(sal)
emp);

ENAME
JOB
SAL
---------- --------- --------SMITH
CLERK
800
SELECT
FROM
GROUP BY
HAVING

15/12/2014

deptno, MIN(sal)
emp
deptno
800
MIN(sal) >
(SELECT MIN(sal)
FROM
emp
WHERE
deptno = 20);

Exemple de Sous-Interrogations multiligne


SELECT
FROM
WHERE

AND

empno, ename, job


1300
1100
emp
800
sal < ANY
950
(SELECT sal
FROM
emp
WHERE job = 'CLERK)
job <> ''CLERK';

EMPNO
--------7654
7521

15/12/2014

ENAME
---------MARTIN
WARD

JOB
--------SALESMAN
SALESMAN

Exemple de Sous-Interrogations multiligne


SELECT
FROM
WHERE

empno, ename, job


1566.6667
2175
emp
2916.6667
sal > ALL
(SELECT avg(sal)
FROM
emp
GROUP BY
deptno)

EMPNO
--------7839
7566
7902
7788

15/12/2014

ENAME
---------KING
JONES
FORD
SCOTT

JOB
--------PRESIDENT
MANAGER
ANALYST
ANALYST

Ajout denregistrement dans une Table

INSERT INTOdept (deptno, dname, loc)


VALUES

(50, 'FINANCES', 'PARIS');

INSERT INTOemp (empno, ename, job,


mgr, hiredate, sal, deptno)

VALUES

(8000, SAAD', 'ANALYST',


7839, SYSDATE, 4000,

20);

15/12/2014

Ajout denregistrement dans une Table


Syntaxe 2:
INSERT INTONomtable [(champs [, champs ...])]
(select );

Les champs de la clause INSERT doit correspondre ceux de la


sous-interrogation
Exemple:
INSERT INTO SALSES (mat, nom, sal, hiredate, deptno)
SELECT empno, ename, hiredate, sal+ comm, deptno
FROM emp
WHERE job like 'SALSES%';

15/12/2014

Modification des donnes dune Table


L'ordre UPDATE permet de modifier les enregistrements dune
table.
Syntaxe :
UPDATE

Nomtable

SET

Champs = valeur [, champs = valeur]

[WHERE

condition];

La clause WHERE permet de modifier une ou plusieurs lignes


spcifiques; en cas dabsence de cette clause toutes les
lignes seront modifies.
Chaque opration de modification doit respecter les
contraintes dintgrit rfrentielle de la base de donnes.

15/12/2014

Modification des donnes dune Table

UPDATE

emp

SET

com =0

WHERE

com is NULL;

UPDATE emp
SET mgr = (SELECT empno
FROM emp
WHERE (deptno = 30) AND (job like 'MANAGER') ) ,
job ='SALSESMEN'
WHERE deptno = 30;

15/12/2014

Suppression des enregistrements dune Table


L'ordre DELETE permet de supprimer des enregistrements a
partir dune table.
Syntaxe :
DELETE [FROM] Nomtable
[WHERE

condition];

La

clause WHERE permet de supprimer une ou plusieurs


lignes spcifiques en labsence de cette clause, toutes les
lignes sont supprimes.
Chaque opration de modification doit respecter les
contraintes dintgrit rfrentielle de la base de donnes.
15/12/2014

Suppression des enregistrements dune Table

DELETE

dept

WHERE

dname = 'FINANCES';

DELETE FROM

emp

WHERE

deptno =
(SELECT deptno
FROM

dept

WHERE dname ='SALES');

15/12/2014

Notion de vue
Une vue est une table virtuelle base sur une ou plusieurs
table (ou sur dautres vues). Cest une fentre par laquelle il est
possible de visualiser ou de modifier des donnes venant de

ces tables (appels tables de base).

Les utilisateurs consultent la base, ou modifier la base (avec


certaines restrictions) travers les vues (Limitation d'accs )

15/12/2014

Cration d'une Vue


Syntaxe
CREATE VIEW NomVue [(alias[, alias]...)]
AS SousInterogation
[WITH CHECK OPTION]
[WITH READ ONLY]

La SousInterogation(ordre select) ne doit pas comporter la


clause ORDER BY.
WITH CHECK OPTION permet de garantir que les ordres
LMD reste dans le domaine de la vue.
WITH READ ONLY assure qu'aucune opration LMD ne sera
excute dans la vue.

15/12/2014

Exemple de cration d'une Vue

CREATE VIEW manager


(matricule, nom, fonction, dateembouche, salaire, Departement )
AS SELECT empno, ename, job,hiredate, sal + nvl(comm,0), dname
FROM emp, dept
WHERE ((emp.deptno = dept.deptno) and
empno in (select mgr from emp where mgr is not NULL))
WITH READ ONLY

Select *
from manager ;

15/12/2014

Suppression dune vue

L'ordre DROP VIEW permet supprimer une vue (les tables de


base correspondantes ne sont pas supprimes).
Syntaxe
DROP VIEW NomVue;

15/12/2014

Partie III:
Langage De contrle de donnes

Contrle des accs utilisateur


Dans un environnement multi-utilisateur, l'accs et l'utilisation

dune base de donnes doit tre scuris; une telle scurit


peut tre classe en deux catgories :

La scurit du systme couvre l'accs la base de donnes


et son utilisation au niveau du systme (nom de l'utilisateur
et mot de passe, espace disque allou aux utilisateurs et
oprations systme autorises par l'utilisateur).

La scurit de la base de donnes couvre l'accs aux objets


de la base de donnes et leur utilisation, ainsi que les
actions excutes sur ces objets par les utilisateurs.
15/12/2014

Privilges
Un privilge donne le droit d'excuter certains oprations sur la

base de donnes(ordres SQL):


Privilges systme : autorisent l'accs la base de donnes
Privilges objet : autorisent la manipulation du contenu des
objets de la base de donnes

15/12/2014

Compte utilisateur
L'ordre CREATE USER permet l'administrateur de base de
donnes de crer de nouveau utilisateurs.
Syntaxe

CREATE USER login


IDENTIFIED BY motpasse;
L'ordre ALTER USER permet de modifier le mot de passe dun
utilisateur.
Syntaxe
ALTER USER
login
IDENTIFIED BY nouveau_motpasse;
15/12/2014

Cration et Attribution d'un Rle


Un rle est un groupe dutilisateur quont les mme privilges.
Un utilisateur peut avoir accs plusieurs rles, et le mme rle
peut tre attribu plusieurs utilisateurs.
L'ordre CREATE ROLE permet l'administrateur de base de
donnes de crer de nouveau utilisateurs.
L'ordre GRANT permet dattribue un rle des utilisateurs
Syntaxe
CREATE ROLE NomRole;
GRANT NomRole to Login1*, Login2, +;

15/12/2014

Retrait d'un Rle

L'ordre REVOKE permet de retirer un rle un utilisateur


Syntaxe
REVOKE RoleX
FROM utilisateur1[, utilisateur2...];

15/12/2014

Privilges systmes de lutilisateur


L'administrateur de base de donnes peut accorder certaines
privilges un utilisateur.
Exemple de privilges

Privilge Systme
CREATE SESSION
CREATE TABLE
CREATE VIEW

Oprations autorises
Connexion la base de donnes
Cration de tables dans le schma de lutilisateur
Cration d'une vue dans le schma de lutilisateur

Des rles sont prfinis par Oracle: Exemple CONNECT permet


un utilisateur de se connecter et de crer des tables.
15/12/2014

Octroi de privilges systme

L'ordre GRANT permet l'administrateur daccorder un


utilisateur certains privilges systmes.
Syntaxe
GRANT Privilege1 *, Privilege2, +
TO ,utilisateur1|Role1*,utilisateur2,+;

15/12/2014

Retrait des privilges systmes


Ladministrateur peut retirer un utilisateur ou un rle certains
privilges systmes qui il leurs a accords.
Syntaxe

REVOKE {privilege1 [, privilege2...]}


FROM {utilisateur1[, utilisateur2...]|role}

15/12/2014

Privilges objets
Le propritaire dun objet dune base de donnes peut accorder
certaines privilges autorisant la manipulation du contenu de cet
objet.

Exemple de privilges
SELECT, ALTER , DELETE , INSERT, REFERENCES, UPDATE

15/12/2014

Octroi de privilges objets


L'ordre GRANT permet daccorder un utilisateur certains
privilges objets.
Syntaxe
GRANT ,privilege_objet *(champs)+|ALLON
nom_objet
TO
{utilisateur|nom_role|PUBLIC}
[WITH GRANT OPTION];

WITH GRANT OPTION autorise le bnficiaire accorder les


privilges objet d'autres utilisateurs et des rles

15/12/2014

Retrait des privilges objets


L'ordre REVOKE permet de retirer un utilisateur ou un rle
certains privilges objets qui leurs taient accords.
Syntaxe
REVOKE {privilege1 [, privilege2...]|ALL}
ON
Objet
FROM {utilisateur1[, utilisateur2...]|role|PUBLIC}
Les privilges accords avec WITH GRANT OPTION seront
automatiquement retirs.

15/12/2014

Transactions de Base de Donnes

Une transaction se compose des lments suivants :


Ensemble d'ordres du LMD effectuant une opration cohrente
des donnes
Un ordre du LDD ou LCD

Une transaction commence l'excution dun ordre SQL et se termine


par l'un des vnements suivants :
COMMIT ou ROLLBACK
Excution d'un ordre LDD ou LCD (validation automatique)
Fin de session utilisateur

Panne du systme

15/12/2014

Transactions de Base de Donnes

Avant toute opration de sauvegarde ou de restauration (COMMIT ou


ROLLBACK) :
Les rsultats des ordres du LMD excuts par l'utilisateur courant ne
peuvent pas tre affichs par d'autres utilisateurs.
Les lignes concernes sont verrouilles. Aucun autre utilisateur ne
peut les modifier

Aprs toute opration de sauvegarde ou de retoration (COMMIT


ou ROLLBACK) :
Les modifications des donnes dans la base sont dfinitives (perte
de l'tat prcdent de la base)
Tous les utilisateurs peuvent voir le rsultat des modifications.
Les lignes verrouilles sont libres et peuvent de nouveau tre
manipules par d'autres utilisateurs
15/12/2014

Transactions de Base de Donnes


COMMIT;
Commit complete.
ROLLBACK;
Rollback complete.

UPDATE ...
SAVEPOINT point1;
Savepoint created.

DELETE
ROLLBACK TO point1;
Rollback complete.

15/12/2014

Partie III: Le langage PL/SQL

15/12/2014

Le langage PL/SQL
Le PL/SQL est une extension du SQL avec des caractristiques
propres aux langages de programmation.

La manipulation et linterrogation des donnes en SQL sont


incluses dans le code procdural.

Permet une programmation modulaire en utilisant des


structures de contrle des langages procduraux (traitement
conditionnel, traitement rptitif, ...) et assure la gestion des
erreurs.

15/12/2014

Structure dun Bloc PL/SQL

DECLARE Optionel

Variables, curseurs
BEGIN Obligatoire

Instructions SQL
Instructions PL/SQL
EXCEPTION Optionel

DECLARE
BEGIN
EXCEPTION
END;

Actions raliser lorsquune


erreur se produit
END; (/)
Obligatoire
Le slash
permet dexcuter un bloc PL/SQL anonyme dans
le buffer SQL*Plus ( Placer un point (.) pour fermer le
buffer SQL*Plus).

15/12/2014

Types de Blocs
Anonyme

Procdure

Fonction

[DECLARE]

PROCEDURE nom
IS

BEGIN
--instructions

BEGIN
--instructions

[EXCEPTION]

[EXCEPTION]

FUNCTION nom
RETURN datatype
IS
BEGIN
--instructions
RETURN valeur;
[EXCEPTION]

END;

END;

END;

15/12/2014

Les variables PL/SQL


Les variables sont dclares et initialises dans la section de
dclarative.
De nouvelles valeurs sont affectes aux variables dans la section
excutable.
Passer des valeurs des procdures ou des fonctions par
lintermdiaire de paramtres.
Syntaxe
identifiant [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];

Exemples
Declare
v_hiredate
v_deptno
v_location
c_comm
v_total_sal
v_valid
15/12/2014

DATE;
NUMBER(2) NOT NULL := 10;
VARCHAR2(13) := 'Atlanta';
CONSTANT NUMBER := 1400;
NUMBER(9,2) := 0;
BOOLEAN NOT NULL := TRUE;

LAttribut %TYPE
Dclarer une variable partir de :

la dfinition dun champs de la base de donnes


la dfinition dune variable prcdemment dclare
Exemples
...
v_ename
v_balance
v_min_balance
...

15/12/2014

emp.ename%TYPE;
NUMBER(7,2);
v_balance%TYPE := 10;

Syntaxe et rgles dcriture


Les instructions peuvent stendre sur plusieurs lignes.
Commencer les commentaires sur une ligne avec deux tirets
(--).

Placer les commentaires stendant sur plusieurs lignes


entre les symboles

/* et */.

Des instructions peuvent tre imbriques partout o une


instruction excutable est permise.

La porte dun objet est la zone du programme qui peut sy


rfrer.

15/12/2014

Oprateurs en PL/SQL
Oprateur
**, NOT
*, /
+, -, ||
=, !=, <, >, <=, >=, IS NULL,
LIKE, BETWEEN, IN
AND
OR

15/12/2014

Opration
Exponentielle, ngation logique
ngation
Multiplication, division
Addition, soustraction,
concatnation
Comparaison
Conjonction
Inclusion

Instructions SQL en PL/SQL


Extraire une ligne de la base de grce la commande SELECT.
Un seul jeu de valeurs peut tre retourn.

Modifiez des lignes dans la base en utilisant des commandes


LMD.

Contrlez une transaction avec les commandes COMMIT,


ROLLBACK, ou SAVEPOINT.

15/12/2014

Instructions SELECT en PL / SQL

Syntaxe (La clause INTO est Obligatoire)


SELECT select_list
INTO
{variable_name[, variable_name]...}
FROM
<tables>
WHERE ...;

Exemple :

DECLARE
v_deptno
v_loc
BEGIN
SELECT
INTO
FROM
WHERE
...
END;

15/12/2014

NUMBER(2);
VARCHAR2(15);
deptno, loc
v_deptno, v_loc
dept
dname = 'SALES';

Extraire des donnes en PL/SQL


Retournez la somme des salaires de tous les employs du service
spcifi.

Exemple
DECLARE
v_sum_sal
v_deptno
BEGIN
SELECT
INTO
FROM
WHERE
END;

15/12/2014

emp.sal%TYPE;
NUMBER NOT NULL := 10;

SUM(sal)
v_sum_sal
emp
deptno = v_deptno;

Mettre jour des donnes


Augmentez le salaire de tous les employs de la table emp dont la
fonction est Analyste.

Exemple
DECLARE
v_sal_increase
emp.sal%TYPE := 2000;
BEGIN
UPDATE
emp
SET
sal = sal + v_sal_increase
WHERE
job = 'ANALYST';
END;

15/12/2014

Exercice
Ecrire un bloc anonyme PLSQL qui saisie le numro (Empno) d'un employ et qui affiche
son

nom(Ename),

sa

fonction(Job),

son

salaire(Sal)

et

le

nom

de

son

dpartement(Dname).
DECLARE
num scott.emp.empno%TYPE; nomE scott.emp.ename%TYPE;
salaire scott.emp.sal%TYPE;
Fct scott.emp.job%TYPE;
nomD scott.dept.dname%TYPE;
begin
num= '&num';
SELECT Ename, Job, Sal, Dname into nomE , Fct, salaire, nomD FROM emp , Dept where
emp. Deptno=Dept.deptno and empno=num;
dbms_output.put_line('Emplot : ' || nomE || ' Fonction :'|| Fct ||
' Salaire :'|| salaire || ' Dept :'|| nomD);
end;
/
La Commande set serveroutput on permet de diriger les sorties de ligne vers lcran
plutt que vers un buffer.
15/12/2014

Exercice
Ecrire une procdure PLSQL nomme Affiche qui reoit en entre le numro (Empno)
d'un employ et qui affiche son nom(Ename), sa fonction(Job), son salaire(Sal) et le nom
de son dpartement(Dname).

create or replace procedure affiche(num scott.emp.empno%TYPE) as


nomE scott.emp.ename%TYPE;
salaire scott.emp.sal%TYPE;
Fct scott.emp.job%TYPE;
nomD scott.dept.dname%TYPE;
begin
SELECT Ename, Job, Sal, Dname into nomE , Fct, salaire, nomD FROM emp , Dept where
emp. Deptno=Dept.deptno and empno=num;
dbms_output.put_line('Emplot : ' || nomE || ' Fonction :'|| Fct ||
' Salaire :'|| salaire || ' Dept :'|| nomD);
end;
/
15/12/2014

Exercice
Ecrire une fonction PLSQL nomm MoySal qui reoit le paramtre job lentre et
qui retourne le salaire moyen des employs qui ont ce job.

create or replace function MoySal(jobrech scott.emp.job%TYPE) return


scott.emp.sal%TYPE as
-- BLOC VARIABLES
moy scott.emp.sal%TYPE;
begin
SELECT avg(sal) into moy FROM emp where job like jobrech;
return moy;
end;
/

15/12/2014

Exercice
En utilisant la procdures et la fonction prcdente (Affiche et MoySal ), crire un bloc
PLSQL anonyme qui :
Demande le numro dun Employ (Empno)
Affiche les informations de lemploy correspondant ainsi que le salaire moyen
des employs ayant le mme job que cet employ.

DECLARE
numE scott.emp.empno%TYPE;
moy scott.emp.sal%TYPE;
jobrech scott.emp.job%TYPE;
begin
numE := '&numE';
affiche(numE);
SELECT job into jobrech FROM emp where empno = numE;
moy:= MoySal(jobrech);
dbms_output.put_line('Moy des salaires est :'|| moy);
end;
/
15/12/2014

instructions conditionnelles IF
On peut modifier lenchanement logique des instructions en
utilisant des instructions conditionnelles IF.
Syntaxe
IF condition THEN
instructions;
[ELSIF condition THEN
instructions;]
[ELSE
instructions;]
END IF;

15/12/2014

Boucles Basiques
Syntaxe
LOOP
instruction1;
. . .
EXIT [WHEN condition];
END LOOP;

-----

initialisation
instructions
EXIT instruction
fermeture de la boucle

Exemple
DECLARE
v_ordid
item.ordid%TYPE := 601;
v_counter
NUMBER(2) := 1;
BEGIN
LOOP
INSERT INTO item(ordid, itemid)
VALUES(v_ordid, v_counter);
v_counter := v_counter + 1;
EXIT WHEN v_counter > 10;
END LOOP;
END;
15/12/2014

Boucles FOR et WHILE


Syntaxe

FOR counter in [REVERSE]


borne_infrieure..borne_suprieure LOOP
instruction1;
instruction2;
la dclaration du compteur
. . .
est implicite
END LOOP;

WHILE condition LOOP


instruction1;
instruction2;
. . .
END LOOP;

15/12/2014

La condition est value


au dbut de chaque
itration.

Curseur SQL
Un curseur est une zone de travail rserve SQL.
Le Serveur Oracle utilise les curseurs implicites pour analyser et

excuter les instructions SQL.


Les curseurs explicites sont dclars de faon explicite par le
programmeur.

15/12/2014

Contrler les Curseurs Explicites


Oui
Non
DECLARE

Crer une
zone SQL
nomme

15/12/2014

OPEN

FETCH

Identifier

Charger la

lensemble
actif de
lignes

ligne
courante
dans des
variables

Existence?

Tester
lexistence
de lignes

si OUI,
Retourner
FETCH

CLOSE

Librer
lensemble
actif

Dclarer un Curseur
Syntaxe
CURSOR cursor_name IS
select_statement;

Nincluez pas la clause INTO dans la dclaration du curseur.


Sil est requis de traiter les lignes dans une squence spcifique, utilisez la
clause ORDER BY dans la requte.
Exemple
DECLARE
CURSOR emp_cursor IS
SELECT empno, ename
FROM
emp;
CURSOR dept_cursor IS
SELECT *
FROM
dept
WHERE deptno = 10;
BEGIN
...
15/12/2014

Ouvrir et fermer un Curseur


Syntaxe

OPEN

cursor_name;

CLOSE

cursor_name;

Ouvrir le curseur pour excuter la requte et identifier lEnsemble de lignes Actif.


Si la requte ne retourne pas de ligne, aucune exception nest signale.
Utilisez les attributs du curseur pour tester le rsultat aprs affectation.
Fermez le curseur aprs avoir termin le traitement des lignes (rouvrir le curseur, si
ncessaire).
Nessayez pas de ramener les donnes dun curseur sil a t ferm.

15/12/2014

Ramener les donnes partir du


Syntaxe
FETCH cursor_name INTO Curseur
[variable1, variable2, ...];
Chargez les valeurs de la ligne courante dans des
variables de sortie.
Exemple
Prvoir le mme nombre de variables.
FETCH emp_cursor INTO v_empno, v_ename;
Ajuster
la position des variables par rapport aux
colonnes.
...
OPEN defined_cursor;
Testez
si le curseur contient des lignes.
LOOP
FETCH defined_cursor INTO defined_variables
EXIT WHEN ...;
...
-- Traiter les donnes ramenes
END LOOP;
...
END;
15/12/2014

Les Attributs dun Curseur Explicite


Attribut

Type

Description

%ISOPEN

Boolean
ouvert.

valu TRUE si le curseur est

%NOTFOUND

Boolean
valu TRUE si le dernier fetch
na pas retourn de ligne.

%FOUND

Boolean
valu TRUE si le dernier fetch
a retourn une ligne ;
complment de %NOTFOUND

%ROWCOUNT

Number
Contient le nombre total de lignes
retournes jusquici.

15/12/2014

Contrle des affectations multiples


Traitez plusieurs lignes partir dun curseur explicite en utilisant une
boucle.
Affectez les lignes que lorsque le curseur est ouvert.
Utilisez lattribut du curseur : %ISOPEN, avant de raliser une

affectation, pour tester si le curseur est ouvert.


Utilisez lattribut du curseur %ROWCOUNT pour ramener un nombre
exact de lignes.
Affectez une ligne chaque itration.
Utilisez lattribut du curseur %NOTFOUND pour tester lchec

dune affectation et dterminer quand sortir de la boucle.


15/12/2014

Exercice

Ecrire une procdure PLSQL nomme Affiche qui reoit en


entre le numro (Empno) d'un employ et qui affiche son

nom(Ename) et sa fonction(Job).

Ecrire un bloc PLSQL anonyme qui :

Demande le numro dun dpartement (Deptno) et affiche le


nom du dpartement correspondant.

Affiche pour chaque employ qui travail dans le dpartement

qui porte le numro saisi, le nom et la fonction (utiliser la


procdure Affiche ).
15/12/2014

Exercice

Ecrire un bloc PLSQL anonyme qui afficher pour un entier n, saisie au


dbut du bloc, les nimes plus anciens embauchs (ename,

hiredate, job) de la table des employs. Testez les cas particuliers


tels que n = 0 et n>au nombre total demploys.

15/12/2014

Exercice
DECLARE
n number; i number :=0; nom scott.emp.ename%TYPE;
Dtemb scott.emp.hiredate%TYPE; Fct scott.emp.job%TYPE;
CURSOR E_Rech IS SELECT ename, hiredate, job FROM emp order by hiredate ASC;
BEGIN
n := '&nombre';
if (n =0) then
dbms_output.put_line('N ne peut pas etre null');
else
open E_Rech ;
loop
i:=i+1;
FETCH E_Rech INTO nom,dtemb,Fct;
if (E_Rech %FOUND AND i<=n) then
dbms_output.put_line('Nom : ' || nom || Date embouche :' || Dtemb);
dbms_output.put_line('Fonction : '|| Fct);
end if;
EXIT WHEN (E_Rech %NOTFOUND or i>n);
end loop;
if (E_Rech %NOTFOUND ) then
dbms_output.put_line('N est plus grand que le nb des employ ');
end if;
end;
15/12/2014

Syntaxe

Curseurs paramtrs

CURSOR nom de_curseur


[(nom_de_parametre type_de_donne, ...)]
IS
instruction_SELECT;

Transmet les paramtres au curseur lors de son


ouverture et lexcution de la requte (open
Exemple
: Passer le numro de dpartement et le job au curseur.
cursor).
DECLARE
CURSOR emp_cursor
Permet
dexcuter plusieurs fois un curseur
(v_deptno NUMBER, v_job VARCHAR2) IS
explicite,
avec
un paramtrage diffrent
SELECT
empno, ename
FROM fois.
emp
chaque
WHERE
deptno = v_deptno
AND
job = v_job;
BEGIN
OPEN emp_cursor(10, 'CLERK');
...

15/12/2014

Manipuler les Exceptions en PL/SQL


Une exception est un identifiant PL/SQL, de type erreur, dclench
pendant lexcution dun bloc PLSQL soit implicitement, par une erreur
Oracle ou explicitement, par appel du programme.
Une exception est traite en linterceptant dans le traitement des
exceptions ou en la propageant lenvironnement appelant

Syntaxe
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
instruction1;
instruction2;
. . .

15/12/2014

Exception pr-dfinie
Syntaxe
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN INVALID_CURSOR THEN
instruction1;
instruction2;
WHEN TOO_MANY_ROWS THEN
instruction1;
WHEN OTHERS THEN
instruction1;
instruction2;
instruction3;
END;

15/12/2014

Fonctions dinterception des Erreurs


Exemple
DECLARE
v_error_code
v_error_message
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code :=
v_error_message

NUMBER;
VARCHAR2(255);

SQLCODE ;
:= SQLERRM ;

INSERT INTO erreurs VALUES(v_error_code,


v_error_message);
END;

SQLCODE : Renvoie la valeur numrique associ au code de lerreur


SQLERRM : Renvoie le message associ au code de lerreur

15/12/2014

Exercice

Crer un script sql regroupant les taches suivantes :


crer une table EMPSAL afin dy stocker les noms et les salaires des employs .
Crer un bloc PL/SQL qui dtermine les employs ayant les salaires les plus levs.
Faire saisir lutilisateur une valeur n dans un paramtre de substitution
SQL*PLUS
Dans une boucle, rcuprez les noms et salaires des personnes les mieux
rmunres dans la table EMP.
Enregistrez les noms et salaires dans la table EMPSAL .
Testez les cas particuliers tels que n = 0 et n >au nombre total demploys dans
EMP prevoir un message dans chacun de ces deux cas.

Afficher le contenu de la table EMPSAL lcran.

15/12/2014