Académique Documents
Professionnel Documents
Culture Documents
BD : Le langage PL/SQL
2 SAGAR Samya
Pourquoi un langage de programmatio ?
3 SAGAR Samya
Pourquoi PL/SQL ?
SQL est un langage ensembliste, non procédural
La nature relationnelle, déclarative de SQL rend l’expression des requêtes
très naturelle
…mais les applications complexes exigent plus :
Pour la facilité et l’efficacité de développement : gérer le contexte et lier entre elles
plusieurs requêtes, créer des librairies de procédures cataloguées réutilisables
Pour l’efficacité de l’application : diminuer le volume des échanges entre client et serveur
(un programme PL/SQL est exécuté sur le serveur)
Les traitements complexes sont parfois difficiles à écrire, si on ne peut
utiliser des variables et les structures de programmation comme les
boucles et les alternatives
On ressent vite le besoin d’un langage procédural pour lier plusieurs
requêtes SQL avec des variables et dans les structures de programmation
habituelles
Nécessité d’étendre les fonctionnalités de SQL.
4 SAGAR Samya
Présentation de PL/SQL
PL/SQL = Procedural Language / Structured Query Language
Langage procédural d’Oracle corporation étendant SQL.
Extension du langage standard SQL par des capacités procédurales.
5 SAGAR Samya
Principales caractéristiques de PL/SQL
PL/SQL: Langage procédural de 4ème génération
La syntaxe ressemble au langage Ada
PL/SQL = la plupart des déclarations SQL combinées avec les
principales instructions des langages de programmation
Déclaration de variables typées et constantes
Des variables permettent l’échange d’information entre les requêtes SQL et
le reste du programme
Traitements itératifs
Traitements conditionnels
Définition de procédures et fonctions
Gestion des erreurs à l'exécution
6 SAGAR Samya
Avantages
Support de SQL, y compris en dynamique : un paramétrage et la création
d'ordres SQL dynamiques
Amélioration des performances: permet le traitement par bloc de SQL et
donc optimise le trafic réseau
Portabilité: indépendant du système d'exploitation et des plate-formes
Intégration avec Oracle: supporte tous les types de données SQL
Utilisation de variable de stockage et de type simple et structuré
dynamique (%TYPE, %ROWTYPE), et la gestion des structures de contrôle,
augmente la capacité de traitement des données
Traitements plus complexes, notamment pour la gestion des curseurs, cas
particuliers et des erreurs (traitement des exceptions), accroît les
possibilités de traitement
Utilisation de librairies standards prédéfinies (supplied PLSQL
packages, comme les RDBMS_xxx),
7 SAGAR Samya
Utilisation de PL/SQL
PL/SQL peut être utilisé pour l’écriture des méthodes
(fonctions et procédures) de type, triggers, packages,
procédures et fonctions stockées.
Il convient aussi pour écrire des fonctions utilisateurs qui
peuvent être utilisées dans les requêtes SQL (en plus des
fonctions prédéfinies)
Il est aussi utilisé dans des outils Oracle, Forms et Report en
particulier
Le PL/SQL peut être utilisé sous 3 formes :
un bloc de code, exécuté comme une commande SQL, via un interpréteur
standard (SQL+ ou iSQL*PLus); « Bloc anonyme »
un fichier de commande PL/SQL
un programme stocké (procédure, fonction, package ou trigger)
8 SAGAR Samya
Ordres SQL supportés dans PL/SQL
Seules les instructions du langage de manipulation de
données (LMD) et certaines instructions de gestion de
transaction sont supportés, à savoir :
9 SAGAR Samya
Requêtes SQL
Chaque requête ‘client’ est transmise au serveur de
données pour être exécutée avec retour de résultats
CLIENT SERVEUR
INSERT INTO … Exécute INSERT
Résultat
DELETE FROM … Exécute DELETE
Résultat
UPDATE … Exécute
Résultat
UPDATE
SELECT …
Exécute SELECT
……. Résultat
10 SAGAR Samya
Bloc PL/SQL
Le bloc de requêtes est envoyé sur le serveur. Celui-ci
exécute le bloc et renvoie 1 résultat final.
CLIENT SERVEUR
BEGIN
Exécution
INSERT …
SI …. ALORS du bloc
SELECT … PL/SQL
FSI
END;
Résultat
11 SAGAR Samya
Structure d’un programme
12 SAGAR Samya
Le bloc PL/SQL
PL/SQL est un langage structuré en blocs, constitués d'un
ensemble d'instructions et qui ne génère qu'un accès à la base.
Types de bloc PL/SQL
Bloc anonyme
Stocké en-dehors de la base de donnée
Compilé et exécuté à la volée
Procédure stockée
Compilée séparément
Stockée de façon permanente dans la BD
Déclencheur (trigger)
Procédure stockée associée à une table
Exécution automatique sur événement
13 SAGAR Samya
Le bloc PL/SQL
Un bloc PL/SQL est intégralement envoyé au moteur PL/SQL,
pour être compilé et exécutés.
14 SAGAR Samya
Le bloc PL/SQL
Le moteur PL/SQL
15 SAGAR Samya
Le bloc PL/SQL
Structure d’un bloc
Le bloc est le concept de base de PL/SQL
Un bloc regroupe les déclarations et instructions reliées logiquement
Chaque bloc PL/SQL peut être constitué de 3 sections :
Une section facultative de déclaration et initialisation de types, variables et constantes
Une section obligatoire contenant les instructions d'exécution
Une section facultative de gestion des erreurs
[DECLARE
… déclarations et initialisation]
BEGIN
… instructions exécutables
[EXCEPTION
… interception des erreurs]
END;
16 SAGAR Samya
Le bloc PL/SQL
Contenu d’un bloc
Seuls BEGIN et END sont obligatoires, forment le corps du programme
Le corps d’un bloc PL-SQL peut contenir:
des instructions PL/SQL (assignements, boules, appel de procédure,…)
toute instruction SQL du LMD (SELECT, INSERT, UPDATE, DELETE)
les commandes SQL de gestion des transactions (COMMIT, ROLLBACK (TO), SAVEPOINT)
tout prédicat utilisable dans SQL
Attention :Ce sont les seuls ordres supportés, pas d’instruction du LDD (ex. DROP, ALTER, …)
Les sections DECLARE et EXCEPTION sont optionnelles
Chaque instruction se termine par « ; »
Les blocs, comme les instructions, se terminent par un « ; »
Remarque applicative: sous SQL*PLUS,
DECLARE ou BEGIN signifie que c’est le début d’un bloc PL/SQL
Le « END; », n’indique pas la fin du bloc, car contrairement au PL/SQL, le « ; » ne signifie pas la
fin du bloc. Sous SQL*plus n’est qu’un indicateur de terminaison d’instruction
Utilisation du « / » (raccourci de la cmde RUN), signifie que le bloc est terminé
17 SAGAR Samya
Le bloc PL/SQL
Blocs imbriqués
Les blocs peuvent être imbriqués
les sous-blocs ont la même structure que les blocs
18 SAGAR Samya
Le bloc PL/SQL
Blocs imbriqués : Portée et visibilité des variables
DECLARE
A CHAR;
/* A (INTEGER) B, C (REAL) */
B REAL;
BEGIN
si dans un bloc, une variable du
/* A (CHAR) B (REAL) */ même nom que la variable
DECLARE GLOBALE existe c'est la variable
A INTEGER; LOCALE qui s'impose
C REAL;
BEGIN
…. un bloc ne peut utiliser les
END; variables d'un autre bloc de
DECLARE même niveau
D CHAR;
BEGIN
… /* A, D (CHAR) B (REAL) */
END;
/* A (CHAR) B (REAL) */
END;
Commentaires :
-- Commentaire sur une seule ligne
/* Commentaire sur plusieurs
lignes */
20 SAGAR Samya
Variables et Types
21 SAGAR Samya
Les Variables en PL/SQL
Types de variables PL/SQL :
Scalaires, les types habituels correspondants aux types SQL2 ou
Oracle : NUMBER(5,2),VARCHAR2, DATE, BOOLEAN, …
Composites, adaptés à la récupération des colonnes et lignes des
tables SQL :%ROWTYPE, %TYPE, RECORD, TABLE
Référence : REF
LOB (Large OBject jusqu’à 4 Go ; pointeur si externe)
Un programme PL/SQL peut également manipuler des
variables non PL/SQL :
Variables de substitution ou globales définies dans SQL*Plus
Variables hôtes (définies dans d’autres programmes et utilisées par le
programme PL/SQL)
Toute variable PL/SQL doit obligatoirement être déclarée
dans une section DECLARE avant utilisation
22 SAGAR Samya
Types PL/SQL
Types scalaires
Nombre Caractère Date/heure
BINARY_INTEGER
DEC CHAR
DECIMAL CHARACTER DATE
DOUBLE PRECISION LONG INTERVAL DAY TO SECOND
FLOAT LONG INTERVAL YEAR TO MONTH
INT RAW TIMESTAMP
INTEGER NCHAR NVARCHAR2 TIMESTAMP WITH LOCAL TIME ZONE
NATURAL RAW ROWID TIMESTAMP WITH TIME ZONE
NATURALN STRING
NUMBER UROWID
NUMERIC VARCHAR VARCHAR2
PLS_INTEGER
POSITIVE Booléen
POSITIVEN REAL
SIGNTYPE
SMALLINT BOOLEAN
Note :les types Oracle sont en gras, les autres sont les sous-types
compatible ANSI/ISO
23 SAGAR Samya
Types PL/SQL
Types scalaires
Nouveaux types numériques prédéfinis PL/SQL
BINARY_INTEGER : entiers signés entre –231 et 231 (Utilise les fonctions de la
librairie arithmétique)
BINARY_FLOAT (10g): Nombre à virgule flottante simple précision au format
IEEE 754. Un littéral de ce type est écrit avec un f terminateur (ex. 3.125f)
BINARY_DOUBLE (10g) : Nombre à virgule flottante double précision au
format IEEE 754. Un littéral de ce type est écrit avec un d terminateur (ex.
3.12548d)
PLS_INTEGER : entiers signés entre –231 et 231 ; plus performant que NUMBER
et BINARY_INTEGER (Plus rapide, car il utilise les registres du processeur) au
niveau des opérations arithmétiques ; en cas de dépassement, exception levée
24 SAGAR Samya
Types PL/SQL
Types scalaires
Les Types caractères prédéfinis PL/SQL
Type de données CHAR VARCHAR2 LONG RAW LONG RAW
25 SAGAR Samya
Types PL/SQL
Types scalaires
Jeu de caractères multi-octets
NCHAR[(n)] : Chaîne de caractères de longueur fixe avec n compris entre 1
et 32767 (par défaut 1)
NVARCHAR2[(n)] : Chaîne de caractères de longueur variable avec n compris
entre 1 et 32767. Le nombre de caractères réellement stockés dépend du
nombre d'octets utilisés pour coder chaque caractère
UROWID, ROWID : Permet de stocker l'adresse absolue d'une ligne dans une
table sous la forme d'une chaîne de caractères. Le format d'une telle variable est
le suivant : 000000FFFBBBBBBRRR
000000 représente le numéro de l'objet qui possède cette ligne (dans le cas de cluster,
plusieurs objets peuvent partager le même segment)
FFF représente le numéro du fichier qui contient la ligne
BBBBBB représente le numéro du bloc dans le fichier
RRR représente le numéro de ligne dans le bloc
26 SAGAR Samya
Types PL/SQL
Types composés Types références
RECORD
TABLE REF CURSOR
VARRAY REF type_objet
27 SAGAR Samya
Une base de données pour les exemples
avion:
pilote:
vol:
28 SAGAR Samya
Variables scalaires
Déclaration
Identificateur [CONSTANT] type [[NOT NULL] {:= |DEFAULT} expression];
CONSTANT : c’est une constante (sa valeur ne peut pas changer, doit être initialisée
lors de la déclaration)
NOT NULL : indique que la variable ne peut pas être NULL, et dans ce cas
expression doit être indiqué (en cas de tentative, une exception VALUE_ERROR
est levée)
Initialisation : affectation ":=" ou DEFAULT
Pas de déclaration multiple dans PL/SQL
number1, number2 NUMBER; ← déclaration incorrecte
Autre possibilité pour affecter une valeur à une variable
SELECT … INTO identificateur FROM … ;
29 SAGAR Samya
Les Opérateur supportés par PL/SQL
Opérateurs Arithmétiques: +, -, /, *, ** (exponentielle)
Opérateur de Concaténation: ||
Parenthèses (contrôle des priorités entre opérations): ()
Opérateurs de Comparaison: =, !=, <, >, <=, >=, IS
NULL, LIKE, BETWEEN, IN
Opérateurs Logiques: AND, OR, NOT
Affectation
30 SAGAR Samya
Affectation
Plusieurs façons de donner une valeur à une variable
Par l’opérateur ":="
Par la directive INTO de la requête SELECT
SELECT … INTO …
Instruction SELECT expr1,expr2, … INTO var1,var2, …
33 SAGAR Samya
Déclaration de types dynamiques
Déclaration %TYPE
Déclarer une variable de même type que :
Une colonne d’une table existante
nomNouvelleVariable NomTable.NomColonne%TYPE [{:= | DEFAULT} expression];
Intérêt :
De rendre effectifs des changements à la base de données
lors de la prochaine compilation sans changer le code.
34 SAGAR Samya
Déclaration de types dynamiques
Déclaration %TYPE : exemple
DECLARE
nomPilote pilote.Nom%TYPE; /* table pilote,
colonne nom */
nomCoPilote nomPilote%TYPE;
BEGIN
…
SELECT Nom INTO nomPilote FROM pilote
WHERE matricule = 1;
35 SAGAR Samya
Déclaration de types dynamiques
Variables %ROWTYPE
Déclarer une variable composite du même type
que les tuples d’une table :
nomNouvelleVariable NomTable%ROWTYPE;
Qu’un curseur ; (voir plus loin)
Les composantes de la variables composite, identifiées par
nomNouvelleVariable.nomColonne,sont du même type que les
colonnes correspondantes de la table
Les contraintes NOT NULL déclarées au niveau des colonnes de la table
ne sont pas transmises aux composantes correspondantes de la variable
Attention, on peut affecter un seul tuple à une variable définie avec
%ROWTYPE
36 SAGAR Samya
Déclaration de types dynamiques
Variables %ROWTYPE : exemple
DECLARE
piloteRecord pilote%ROWTYPE;
agePilote NUMBER(2) NOT NULL := 35;
BEGIN
piloteRecord.Age := agePilote;
piloteRecord.Nom := ‘Pierre’;
piloteRecord.Ville := ‘Bordeaux’;
piloteRecord.Salaire := 45000;
37 SAGAR Samya
Variables de substitution
Passer comme paramètres à un bloc PL/SQL des variables
définies sous SQL*Plus :
SQL> ACCEPT s_matPilote PROMPT ‘Matricule : ’
SQL> ACCEPT s_nomPilote PROMPT ‘Nom pilote : ’
SQL> ACCEPT s_agePilote PROMPT ‘Age pilote : ’
DECLARE
v_salairePilote NUMBER(6,2) DEFAULT 32000;
BEGIN
INSERT INTO pilote VALUES (‘&s_matPilote’,‘&s_nomPilote’,
NULL, &s_agePilote, v_salairePilote);
END;
/
57 SAGAR Samya
Résolution des noms
Règles de résolution des noms :
Le nom d’une variable du bloc l’emporte sur le nom d’une
variable externe au bloc (et visible)
Le nom d’une variable l’emporte sur le nom d’une table
Le nom d’une colonne d’une table l’emporte sur le nom d’une
variable
Bloc interne
Étiquettes de blocs :
<<blocExterne>>
DECLARE
dateUtilisee DATE;
BEGIN
DECLARE
dateUtilisee DATE;
BEGIN
dateUtilisee := blocExterne.dateUtilisee;
END;
END blocExterne;
58 SAGAR Samya
Entrées et sorties
Paquetage DBMS_OUTPUT :
Mise dans le tampon d’une valeur :
PUT(valeur IN {VARCHAR2 | DATE | NUMBER});
59 SAGAR Samya
Entrées et sorties
Lecture d’une ligne :
GET_LINE(ligne OUT VARCHAR2(255),statut OUT
INTEGER);
Exemple :
DECLARE
tableau DBMS_OUTPUT.CHARARR;
nombreLignes INTEGER := 2;
BEGIN
DBMS_OUTPUT.PUT_LINE(‘Nombre de lignes : ’ ||nombreLignes);
DBMS_OUTPUT.GET_LINES(tableau, nombreLignes);
END;
60 SAGAR Samya
Entrées et sorties
Autres API pour des E/S spécifiques :
61 SAGAR Samya
Structures de contrôle
65 SAGAR Samya
Structures conditionnelles
IF
Syntaxe :
IF condition1 THEN instructions1;
[ELSIF condition2 THEN instructions3;]
[ELSE instructions2;]
END IF;
66 SAGAR Samya
Structures conditionnelles
IF : Exemple
Donner un bloc PL/SQL permettant selon l'âge d’un
pilote de lui fixer un salaire de 28004 dinars s’il est âgé de
45 ans et de 11758 dinars s’il es âgé de 24 ans. L'âge sera
saisi à travers une variable sql*plus.
67 SAGAR Samya
Structures conditionnelles
IF : Exemple
68 SAGAR Samya
Structures conditionnelles
Case
Syntaxe avec expressions :
[<<etiquette>>]
CASE variable
WHEN expression1 THEN instructions1;
WHEN expression2 THEN instructions2; … Cas par
[ELSE instructionsj;] défaut
END CASE [etiquette];
Syntaxe avec conditions (searched case) :
[<<etiquette>>]
CASE
WHEN condition1 THEN instructions1;
WHEN condition2 THEN instructions2; …
[ELSE instructionsj;]
END CASE [etiquette];
Le premier cas valide est traité, les autres sont ignorés
Aucun cas valide : exception CASE_NOT_FOUND levée !
69 SAGAR Samya
Structures conditionnelles
Case : Exemple
SQL> ACCEPT s_agePilote PROMPT ‘Age pilote : ’
DECLARE
salairePilote pilote.Salaire%TYPE;
BEGIN
CASE &s_agePilote
WHEN 45 THEN salairePilote = 28004;
WHEN 24 THEN salairePilote = 11758;
END CASE;
DBMS_OUTPUT.PUT_LINE(‘Salaire de base : ’ ||
salairePilote);
EXCEPTION
WHEN CASE_NOT_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘Évaluer expérience’);
END;
70 SAGAR Samya
Structures conditionnelles
Case retournant une valeur : Exemple
SQL> ACCEPT s_agePilote PROMPT ‘Age pilote : ’
DECLARE Case renvoie
salairePilote pilote.Salaire%TYPE; une valeur qui
BEGIN vaut résultat1
salairePilote := CASE &s_agePilote ou résultat2, ….
WHEN 45 THEN 28004; Ou le résultat
WHEN 24 THEN 11758; par défaut dans
END CASE; le cas de ELSE
DBMS_OUTPUT.PUT_LINE(‘Salaire de base : ’ ||
salairePilote);
EXCEPTION
WHEN CASE_NOT_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘Évaluer expérience’);
END;
71 SAGAR Samya
Structures répétitives
tant que (while)
Syntaxe :
[<<etiquette>>]
WHILE condition LOOP
instructions;
END LOOP [etiquette];
72 SAGAR Samya
Structures répétitives
tant que (while) : Exemple
DECLARE
valeurEntiere INTEGER := 1;
produitSerie INTEGER := 1;
BEGIN
WHILE (valeurEntiere <= 10) LOOP
produitSerie := produitSerie * valeurEntiere;
valeurEntiere := valeurEntiere + 1;
END LOOP;
END;
73 SAGAR Samya
Structures répétitives
Répéter
Syntaxe :
[<<etiquette>>]
LOOP
instructions1;
EXIT [WHEN condition];
[instructions2;]
END LOOP [etiquette];
DECLARE
valeurEntiere INTEGER := 1;
produitSerie INTEGER := 1;
BEGIN
LOOP
produitSerie := produitSerie * valeurEntiere;
valeurEntiere := valeurEntiere + 1;
EXIT WHEN valeurEntiere >= 10;
END LOOP;
END;
75 SAGAR Samya
Structures répétitives
Répéter : Boucles imbriquées
DECLARE
…
BEGIN
…
<<boucleExterne>>
LOOP
…
LOOP
…
EXIT boucleExterne WHEN …; /*quitter boucle externe*/
…
EXIT WHEN …; -- quitter boucle interne
END LOOP;
…
END LOOP;
…
END;
76 SAGAR Samya
Structures répétitives
Pour (for)
Syntaxe :
[<<etiquette>>]
FOR compteur IN [REVERSE] valInf..valSup LOOP
instructions;
END LOOP;
77 SAGAR Samya
Structures répétitives
Pour (for) : Exemple
DECLARE
valeurEntiere INTEGER := 1;
produitSerie INTEGER := 1;
BEGIN
FOR valeurEntiere IN 1..10 LOOP
produitSerie := produitSerie * valeurEntiere;
END LOOP;
END;
78 SAGAR Samya
Structures répétitives
Pour (for) : Exemple
Afficher le numéro des enregistrement de la table pilote et
afficher le nombre total des pilotes
DECLARE
Nbligne number(3);
compteur number(3);
BEGIN
select count(*) into Nbligne from pilote;
For compteur IN 1 .. Nbligne LOOP
dbms_output.put_line(‘la ligne : ‘|| compteur);
END LOOP;
dbms_output.put_line(‘nombre de pilotes: ‘|| Nbligne);
END;
79 SAGAR Samya
Interaction avec la base
80 SAGAR Samya
Interrogation directe des données
L’interrogation directe des données doit retourner 1
enregistrement (sinon TOO_MANY_ROWS ou
NO_DATA_FOUND)
81 SAGAR Samya
Manipulation des données
Insertions :
INSERT INTO nomTable (liste colonnes)
VALUES (liste expressions);
Modifications :
UPDATE nomTable SET nomColonne =
expression [WHERE condition];
Suppressions :
DELETE FROM nomTable [WHERE condition];
82 SAGAR Samya