Sunteți pe pagina 1din 30

Oracle - PL / SQL

(Procedural Language / Structured


Query Language)

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

Oracle APPLICATION (PGI)


DESIGNER
DEVELOPPER

SQL
DICTIONNAIRE
DONNEES

D
Noyau

Prsentation du langage
PL/SQL

PL/SQL
SQL STATEMENT EXECUTOR
Intgr au noyau RDBMS.

PROCEDURAL STATEMENT EXECUTOR


Intgr au noyau et aux outils
(Forms, Rports, OAS, )

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.

SQL & PL/SQL

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

Chaque instruction se termine par un point virgule.


Les commentaires sont possibles /* */.
Possibilit dimbrication des blocs.

PARTIE DECLARATIVE BLOC


PL/SQL
LES VARIABLES & LES TYPES
Les variables locales : Elles ne sont pas visibles dans tous les blocs.
Elles peuvent tre simples ou structures.
Les variables globales : elles sont dclares dans la partie commune tous
les blocs. Elles peuvent tre simples ou structures.
Les variables externes (bind variables) : elles sont externes tous les blocs.
(variables sql+, variables pro*, champs dans les forms).
Remarque
Les variables externes sont prcdes de :.

PARTIE DECLARATIVE BLOC


PL/SQL
Types
classiques
Type

Syntaxe

Remarques / Exemple

NUMBER

NUMBER [(total [ , Dcimal])]

Total est max gal 38.


Salaire NUMBER(7,2)

CHAR

CHAR [(longueur)]

Nom CHAR(15)

VARCHAR2

VARCHAR2 [(longueur)]

Le type chane le plus efficace


sous Oracle

DATE

DATE

Date_Naiss DATE

RAW

RAW (longueur)

Gr comme le VARCHAR2, mais


pas affichable.
Seq RAW(100)

LONG

LONG

Permet de stocker des chanes


d'une longueur max de 2 Go.
Texte LONG

LONG RAW

LONG RAW

Stockage de fichiers binaires


comme les images, son et de la
vido.
Longueur max est 2Go
Photo LONG RAW

PARTIE DECLARATIVE BLOC


PL/SQL
Types propres
PL/SQL
Type

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

Les valeurs : TRUE, FALSE, NULL

Remarques
Les types BINARY_INTEGER et PLS_INTEGER requirent moins
despaces que les types NUMBER.

PARTIE DECLARATIVE BLOC


PL/SQL
Conversion de types
Conversion implicite : effectue par PL/SQL
Conversion explicites par les fonctions.

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,

PARTIE DECLARATIVE BLOC


PL/SQL
Dans la partie DECLARE

Dclaration de
variables

Syntaxe1 : <nom_var> <type>


<initialisation> ;
Syntaxe2 : <nom_var> <nom_var_ref>
%TYPE <init> ;
Syntaxe2 :
<nom_var> <nom_table.nom_var_ref>%TYPE
<init> ;
Avec oprateur daffectation :=

Initialisation

Par le mot cl DEFAULT ( la place de :=)


Par la clause INTO de lordre SELECT
Par le biais dun curseur

PARTIE DECLARATIVE BLOC


PL/SQL
Exemples de
dclarations

-- 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.

-- Mme type que la colonne salaire de la

Remarque
La contrainte NOT NULL dune colonne ne sapplique sur la variable.

PARTIE DECLARATIVE BLOC


PL/SQL
Les variables rfrences une table de la
base
Elles sont lies des tables au niveau de la base.
On les dclare par lattribut : %ROWTYPE
Exemples
DECLARE
base.

agent employe%ROWTYPE

-- employe est la table employe de la

Au niveau traitement, on pourra crire :


BEGIN

Ou

END;
BEGIN

END;

SELECT *
INTO agent
FROM employe
WHERE nom=DUMAS;

-- Slection de tous les champs

SELECT nom,dt_entree
-- Slection de certains champs
INTO agent.nom, agent.dt_entree
FROM employe
WHERE nom=DUMAS';

PARTIE DECLARATIVE BLOC


PL/SQL
LES TYPES
STRUCTURES -

RECORD
2

Syntaxe de dclaration du type


TYPE <nom_type_record> IS RECORD (
<membre1 > <type1>,
<membre2 > <type2>,

<membren > <typen>


);

Dclaration des variables de type record


<nom_type_record> <nom_variable>,
;

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;

PARTIE DECLARATIVE BLOC


PL/SQL
LES TYPES
STRUCTURES -

Syntaxe de dclaration du type

TYPE <nom_type_tableau> IS TABLE OF


<type_simple>| <type_record>|
<Colonne_Table>
INDEX BY BINARY_INTEGER ;

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.

PARTIE DECLARATIVE BLOC


PL/SQL
LES TYPES STRUCTURES - TABLEAUX
Exemple
DECLARE

TYPE t_tab_salaire TABLE OF


NUMBER(11,3);
tab1 t_tab_salaire;
BEGIN

END;

tab1(-100) := 2500;
tab1(-50) := 1500;
tab1(15) :=2000;

PARTIE DECLARATIVE BLOC


PL/SQL

TABLEAUX Primitives de manipulation des


indices -

Primitives

Rle

EXISTS(n)

Retourne TRUE si l'lment d'indice n existe.

COUNT

Retourne le nombre d'lments du tableau.

FIRST &
LAST

La plus petite et la plus grande valeur de l'indice


du tableau.

PRIOR(n)

Valeur de l'indice qui prcde n.

NEXT(n)

Valeur de l'indice qui suit n.

DELETE

Supprime tous les lments du tableau.

DELETE(n)

Supprime le nime lment du tableau.

DELETE(m,n
)

Supprime les lments de m n.

PARTIE EXECUTABLE

Oprateur
s
Type

Rle

ARITHMETIQUE
S

+ , - , * , ** , /

RELATIONNELS

<> , != , < , > , = , IS NOT NULL , IN , LIKE , AND , OR


, BETWEEN ,

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

IF THEN ELSE END


IF
IF THEN ELSIF ELSE
END IF

STRUCTURES
REPETITIVES

LOOP END LOOP

WHILE LOOP END


LOOP
FOR LOOP END LOOP

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;

ELSIF <conditionN> THEN


-- SquenceN Instructions;
ELSE
-- Squence_else
Instructions;
END IF;

PARTIE EXECUTABLE
STRUCTURES
REPETITIVES

[<label<]
LOOP
;
EXIT [label] [ WHEN
<condition>] ;

END LOOP [label] ;

WHILE <condition>
LOOP
;
END LOOP ;

FOR <compteur> IN [REVERSE]


b_inf..b_sup
LOOP
;
END LOOP;
- Compteur est dclare implicitement.
- Interdiction de modification de compteur
dans
la boucle.
- La notion de pas n'existe pas (pas=1 ou
-1).

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

TRAITEMENT DES LIGNES


DU CURSEUR

FETCH INTO

BEGIN
;

FETCH <nom_cur> INTO {<liste_var> |


<var_record>};
;
END;

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

LOOP END LOOP

FOR enreg IN <nom_curseur>


LOOP

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;

LES CURSEURS PARAMETRES


Il est possible de paramtrer un curseur pour une utilisation commune plusieurs
traitements.
Syntaxe dclaration
DECLARE
CURSOR <nom_curseur> (p1 type_p1 [,p2 type_p2 [, ]) IS
SELECT
FROM
WHERE <condition qui utilisent les paramtres>
;

Utilisation du curseur paramtrer


BEGIN
OPEN <nom_cur>(val1,[,val2 [,]);
FETCH <nom_cur>
INTO ;
CLOSE <nom_cur>;
END;

S-ar putea să vă placă și