Documente Academic
Documente Profesional
Documente Cultură
Problmatique
pose par SQL
SQL est un langage non procdural,
rpondant la question QUOI ? Mais pas au
COMMENT ?
Les dveloppeurs ont besoin dassembler
des donnes et de les traiter ligne par
ligne.
Solution apporte par
Oracle partir de la version
6
Mise en place dun langage de traitement
procdural qui facilite la tche des dveloppeurs
et qui permet de pallier aux carences du
langage SQL : PL/SQL.
Prsentation du langage
PL/SQL
PL/SQL
SQL
DICTIONNAIRE
DONNEES
D
Noyau
Prsentation du langage
PL/SQL
PL/SQL
SQL STATEMENT EXECUTOR
Intgr au noyau RDBMS.
REGLES
Dclarations possibles des variables.
Intgration de la majorit des ordres SQL..
Traitements squentiels.
Excution conditionnelle de blocs dinstructions.
Traitements rptitifs (boucles).
Gestion des exceptions.
LID
Intgr
s
SELECT
Non
intgrs
EXPLAIN PLAN
LMD
INSERT
UPDATE
DELETE
LOCK TABLE
CREATE
ALTER
DRPO
TRANSACTIO
N
COMMIT
ROLLBACK
SAVEPOINT
SET TRANSACTION
GRANT
REVOKE
FONCTIONS
SUM
DECODE
MOD
UPPER
SYSDATE
TO_CHAR
ALTER SESSION
SET ROLE
ALTER SYSTEM
STRUCRURE
DUN BLOC
PL/SQL
BLOC PL/SQL
Partie
dclarative
(optionnelle)
Partie
excutable
(obligatoire)
Partie
exception
(optionnelle)
DECLARE
BEGIN END
EXCEPTION
Syntaxe
Remarques / Exemple
NUMBER
CHAR
CHAR [(longueur)]
Nom CHAR(15)
VARCHAR2
VARCHAR2 [(longueur)]
DATE
DATE
Date_Naiss DATE
RAW
RAW (longueur)
LONG
LONG
LONG RAW
LONG RAW
Syntaxe
Remarques / Exemple
BINARY_INTEG
ER
BINARY_INTEGER
-2E31-1 +2E31-1
-2.147.483.647 + 2.147.483.647
PLS_INTEGER
PLS_INTEGER
-2.147.483.647 + 2.147.483.647
BOOLEAN
BOOLEAN
Remarques
Les types BINARY_INTEGER et PLS_INTEGER requirent moins
despaces que les types NUMBER.
BINARY
_
INTEGE
R
BINARY_
INTEGER
CHAR
OUI
VARCHAR2
OUI
LONG
CHAR
VARCHA
R2
LONG
NUMBE
R
PLS_IN
TEGER
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
NUMBER
OUI
OUI
OUI
OUI
PLS_INTEGER
OUI
OUI
OUI
OUI
DATE
OUI
OUI
OUI
RAW
OUI
OUI
OUI
ROWID
DATE
RAW
ROWI
D
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
OUI
Conversion explicites : TO_CHAR,
TO_NUMBER,
TO_DATE, TO_LOB, CHARTOROWID
TO_SINGLE_BYTE,
Dclaration de
variables
Initialisation
-- Exemple 1
DECLARE
num_emp
NUMBER(10);
date_jour DATE :=SYSDATE; -- Initialise la date du jour
logique BOOLEAN;
trouve
logique%TYPE DEFAULT FALSE;
n
NUMBER :=-5;
carre
NUMBER :=n**2;
-- Exemple 2
DECLARE
nom_emp VARCHAR2(35) NOT NULL :="BENOIT";
chaine VARCHAR2(25) DEFAULT 6;
-- Conversion implicite
nombre NUMBER(3) :=5;
-- Conversion implicite
pi
CONSTANT NUMBER :=3.14;
-- Dclaration d'une constante
-- Exemple 3
DECLARE
sal employe.salaire%TYPE :=0;
table employe.
Remarque
La contrainte NOT NULL dune colonne ne sapplique sur la variable.
agent employe%ROWTYPE
Ou
END;
BEGIN
END;
SELECT *
INTO agent
FROM employe
WHERE nom=DUMAS;
SELECT nom,dt_entree
-- Slection de certains champs
INTO agent.nom, agent.dt_entree
FROM employe
WHERE nom=DUMAS';
RECORD
2
3
Utilisation
<nom_variable>.<membre> :=
<expression>;
Exemple
DECLARE
TYPE emp_type_rec IS RECORD
(num employe.empno%TYPE,
service e_service.nom%TYPE,
salaire NUMBER(11,2),
date_jour DATE :=SYSDATE);
var_emp1 emp_type_rec;
var_emp2 emp_type_rec;
v_emp1.num:=2550;
v_emp1.nom:='LAROUSSI'
v_emp2:=v_emp1;
TABLEAUX
2
Dclaration des variables de type
tableau
<nom_type_tableau> <var_tableau> ;
3
Accs aux donnes
<var_tableau>(<indice>) :=
<expression> ;
Remarques
- La valeur de l'indice varie de :
-2.147.483.647 + 2.147.483.647.
- Les lignes intermdiaires existent
potentiellement
mais n'occupent aucun espace.
END;
tab1(-100) := 2500;
tab1(-50) := 1500;
tab1(15) :=2000;
Primitives
Rle
EXISTS(n)
COUNT
FIRST &
LAST
PRIOR(n)
NEXT(n)
DELETE
DELETE(n)
DELETE(m,n
)
PARTIE EXECUTABLE
Oprateur
s
Type
Rle
ARITHMETIQUE
S
+ , - , * , ** , /
RELATIONNELS
AUTRES
OPERATEURS
( ) , ; , , , . , := , || , /* .. */ ,
Remarques
- Un systme de priorit est respect pour l'valuation des expressions
( ) , ** , * / , + - .
PARTIE EXECUTABLE
STRUCTURES
DE CONTROLE
STRUCTURES
CONDITIONNELLES
IF THEN END IF
STRUCTURES
REPETITIVES
PARTIE EXECUTABLE
STRUCTURES
CONDITIONNELLES
IF <condition> THEN
-- Squence1
instructions;
END IF;
IF <condition> THEN
-- Squence1 instructions;
ELSE
-- Squence2 instructions;
END IF;
IF <condition1> THEN
-- Squence1 instructions;
ELSIF <condition2> THEN
-- Squence2 Instructions;
ELSIF <condition3> THEN
-- Squence3 Instructions;
PARTIE EXECUTABLE
STRUCTURES
REPETITIVES
[<label<]
LOOP
;
EXIT [label] [ WHEN
<condition>] ;
WHILE <condition>
LOOP
;
END LOOP ;
PARTIE EXECUTABLE
LES CURSEURS
Une zone mmoire de taille fixe contenant le rsultat d'une requte.
Utilise pour interprter et analyser les ordres SQL.
Le nombre de curseurs ouverts simultanment est dfini par le paramtre
OPEN_CURSORS .
dans le PFILE de la base.
CURSEURS
IMPLICITES
EXPLICITES
gnrs et grs
par le noyau
Oracle pour
chaque ordre SQL
Dclar par
l'user dans la
section
DECLARE d'un
bloc PLS
LES CURSEURS
EXPLICITES
tapes de cration
d'un CURSEUR
explicite
DECLARATION DU
CURSEUR
CURSOR IS
OUVERTURE DU CURSEUR
OPEN
ACCES AU CURSEUR
FETCH INTO
FERMETURE DU CURSEUR
CLOSE
LES CURSEURS
EXPLICITES
DECLARATION DU
CURSEUR
Syntaxe
DECLARE
CURSOR IS
CURSOR <nom_curseur> IS
SELECT col1, col2, col3,
FROM tab1, tab2, tab3,
WHERE <condition>;
Exemple
DECLARE
CURSOR c_employe IS
SELECT empno, ename, salaire
FROM employe
WHERE salaire BETWEEN 1000 AND
2500 ;
LES CURSEURS
EXPLICITES
OUVERTURE D'UN
CURSEUR
OPEN
Syntaxe
BEGIN
;
OPEN <nom_curseur>;
;
END;
Exemple
DECLARE
CURSOR c_employe IS
SELECT empno, ename, salaire
FROM employe
WHERE salaire BETWEEN 1000 AND
2500 ;
BEGIN
OPEN c_employe;
;
END;
LES CURSEURS
EXPLICITES
Syntaxe
FETCH INTO
BEGIN
;
Exemple
DECLARE
no employe.empno%TYPE;
-- Variables
programmes
name employe.ename%TYPE;
CURSOR c_employe IS
-- Curseur
SELECT empno, ename
FROM employe
WHERE salaire BETWEEN 1000 AND 2500 ;
BEGIN
OPEN c_employe;
FETCH c_employe INTO no,ename;
lignes du cruseur
DBMS_OUTPUT.PUT_LINE(no,ename) ;
END;
-- Accs aux
LES CURSEURS
EXPLICITES
FERMETURE D'UN
CURSEUR
CLOSE
Syntaxe
BEGIN
;
CLOSE <nom_curseur>;
;
END;
Exemple
DECLARE
CURSOR c_employe IS
SELECT empno, ename, salaire
FROM employe
WHERE salaire BETWEEN 1000 AND
2500 ;
BEGIN
OPEN c_employe;
;
CLOSE c_employe;
END;
LES CURSEURS
EXPLICITES
ATTRIBUTS DES
CURSEURS
Attribut
Type
Syntaxe
Rle
%NOTFOUN
D
Boolen
%FOUND
Boolen
%ROWCOUN
T
Numriq
ue
Retourne le nombre de
lignes ramenes par la
commande FETCH.
%ISOPEN
Boolen
Retourne TRUE si le
curseur est ouvert et
FALSE sinon.
Retourne TRUE si la
dernire commande
FETCH n'a pas ramen
de lignes.
{<nom_cursor>}
%ATTRIBUT
Retourne TRUE si la
dernire commande
FETCH a ramen une
ligne.
LES CURSEURS
EXPLICITES
Parcours des lignes d'un
curseur
En passant par la boucle
En utilisant la boucle
BEGIN
LOOP
FETCH ;
INTO ;
IF <curseur>%FOUND THEN
ELSE
EXIT ;
END IF
END LOOP;
END LOOP;
Exemple
FOR enreg IN c_employe
LOOP
END LOOP;