Vous êtes sur la page 1sur 27

PL/SQL: Introduction

• Langage procédural;
• Extension du langage SQL;
• Possède des caractéristiques propres aux langages de
programmation:
- Déclaration des variables et des constantes;
- Définition de sous-programmes;
- Gestion des erreurs à l’exécution.
• Permet d’inclure des instructions SQL pour la
manipulation et l’interrogation des données.
 Avantages:

• Programmation modulaire: blocs;

• Portabilité;

• Déclaration des var, const;

• Structures de contrôle;

• Gestion des erreurs.

 Inconvénients:

• Pas d’instructions du LDD.


Programme PL/SQL
 Structure d’un bloc PL/SQL:
• PL/SQL n’interprète pas une instruction mais un bloc;
DECLARE (opt)
const, var, curseurs, exceptionsdéfinis par l’util
BEGIN (obl)
Instructions SQL, PL/SQL
EXCEPTION (opt)
Actions en cas d’erreurs
END;
DECLARE
nom_var type ;
BEGIN
SELECT non_col
INTO nom_var
FROM nom_table ;
Traitements utilisant nom_var … ;
EXCEPTION
WHEN nom_exception THEN actions … ;
END;
• Les var sont utilisées pour:
- Stocker temporairement des données;
- Manipuler des valeurs stockées;
- Réutiliser plusieurs fois les mêmes données.
 Déclarations PL/SQL:
• Entre DECLARE …et…. BEGIN
• identif [Constant] type [Not Null] [:= ou default
expr];
• dat_naiss DATE ;
• compteur INTEGER := 0 ;
 Type de données:
• Types simples:
Number (Integer, Real, Decimal, Float)
Char: chaîne de caract de longueur fixe
Varchar2: chaîne de caract de longueur variable
Boolean
Date
Binary_Integer
• Types composés:

Record: Type nom_type IS RECORD (var1 type,


var2 type, …);

Table: Type nom_type TABLE OF type index by


binary_integer;

• Autres:
Type d’une autre var: nomVar2 nomVar1%Type

Type d’un tuple d’1 table: nomvar nom_tab%Rowtype


 Règles pour la déclaration de var:
• déclarer dans la section Declare avant l’utilisation dans
le bloc;
• la déclaration d’1 var ne peut faire référence qu’à des
var déclarées antérieurement;
• Une var non initialisée contient aut la valeur Null;
• Si on utilise Not Null, il faut initialiser la var;
• Le mot Constant doit précéder le type;
• Une constante doit être initialisée à la création;
• Règles pour l’identificateur:
• Exples:
somme Number(6,3);
fonction Char (15) := ‘chef de service’;
nom fonction%Type;
num client.matricule%Type;
cl Client%Rowtype;
EtCiv char(1) Not Null:= ‘C’;
Pi constant number:= 3.14;
Les Instructions
• Sur plusieurs lignes, mais les mots clés ne doivent pas être
coupés;
• les var peuvent être séparées par:
- des espaces,
- des délimiteurs (+, -, * …, /*, */),
- des identif,
- des valeurs: caract et dates entre ‘ ‘,
- des commentaires: -- ou /* …. */ .
 Les opérateurs:
• arithmétiques, logiques, de concaténation et des ( );
• traités en fonction de leurs priorités: **, not, *, /, +, -,
||, =, != <=, >=, like, in, between, and, or, …
 Instructions de base:
• Affectation:
- id := expr; v_nom:= ‘ali’; v_datNaiss:= ‘30-01-80’ ;
- valeur demandée à l’utilisateur:
ACCEPT nomVar1 PROMPT ‘message …’
DECLARE nomVar2 type := & nomVar1;
• Affichage:
- variable hôte (non PL/SQL):
VARIABLE nomVar1 type
ACCEPT …
DECLARE
….
BEGIN

:nomVar1:= …
END;
PRINT nomVar1;
- commande DBMS_OUTPUT.PUT_LINE

SET SERVEROUTPUT ON

ACCEPT …

DECLARE

DBMS_OUTPUT.PUT_LINE (‘message …’ || nomVar ||…)

END;
VARIABLE salmens NUMBER
ACCEPT salAn PROMT ‘Donner sal annuel:’
DECLARE
v_sal number (9,3) := &salAn;
BEGIN
: salmens := v_sal/12;
END;
PRINT salmens
SET SERVEROUTPUT ON
ACCEPT salAn PROMT ‘Donner sal annuel:’
DECLARE
v_sal number (9,3) := &salAn;
BEGIN
: salmens := v_sal/12;
DBMS_OUTPUT.PUT_LINE (‘sal mensuel =’ || v_sal);
END;
 Utilisation de fonctions:
• Fonctions SQL (ceil(n), floor(n), sqrt(n), lower(ch),
upper(ch), ltrim(ch,n), sysdate, to_date(ch), NVL(x,val)
next_day(date), to_number(ch), …;
• Pas de fonctions de groupe (AVG, SUM, COUNT, ….);
• Ex:
- V_nom := Upper(V_nom);
- V_date := to_date(‘01 Janvier 2004’, ‘dd month yyyy’);
 Instructions standard SQL:

• Select

• Insert

• Update

• Delete
 Blocs imbriqués et portée des variables:

• un bloc imbriqué est une instruction;

• Diviser la partie exécutable d’un bloc en un ensemble de

blocs plus petits;

• Portée: un identifiant est visible dans:

- Le bloc dans lequel il est déclaré;

- Tous les blocs imbriqués dans ce bloc;

- Les procédures et les fonctions de ce bloc.


Ex:
DECLARE
x Integer;
BEGIN
x…..
DECLARE
y Number; Portée de x
BEGIN
x ….. Portée de y
y….
END;
…..
END;
DECLARE
v-sal Number (7,2) := 6000;
v-com Number (7,2) := v-sal * 0.2;
v-mes Varchar (255) := ‘présent’;
BLOC
BEGIN …
DECLARE
v-sal Number (7,2) := 5000;
v-com Number (7,2) := 0;
v-salt Number (7,2) := v-sal + v-com;
BEGIN …
Sous-bloc
v-mes := ‘ X n’est pas ‘ || v-mes;
END;
v-mes := ‘ l’employé ‘ || v-mes;
END;
Structures de contrôle
• Modifient l’enchaînement logique des instructions;
• 2 types de structures de contrôle:
– Conditionnelle;
– Itérative.
 Structures conditionnelles:
• IF-THEN-END IF;
• IF-THEN-ELSE-END IF;
• IF-THEN-ELSIF-END IF.
• Syntaxe:
IF condition THEN
instructions;
[ ELSIF condition THEN
instructions;]
[ ELSE
instructions; ]
END IF;
• condition: utilise des var définies ou les opérateurs de
comparaison: =, <, <=, >, >=, <>, IS NULL, IS NOT NULL.
………………..
IF v-sal > 2000 THEN
v-imp := 0.3 * v-sal;
ELSIF v-sal >= 1000 THEN
v-imp := 0.2 * v-sal;
ELSE
v-imp := 0.1 * v-sal;
END IF;
…………….
 Structures itératives:

• Permet d’exécuter +ieurs fois une instruct°(ou

++eurs);

• 3 types de boucles:

– Boucle basique: sans condition;

– Boucle FOR: un certain nombre de fois;

– Boucle WHILE: selon une condition.


 Basique:
• jeu d’instructions entre LOOP et END LOOP;
• Le mot clé EXIT permet d’arrêter la boucle;
• Il dépend d’une condition IF ou d’une instruction
autonome (avec WHEN);
LOOP
instructions;
EXIT [WHEN condition];
END LOOP;
 FOR:
FOR compteur IN [REVERSE] Binf . . Bsup LOOP
instructions;
END LOOP;
• Le nombre d’itérations est connu au départ;
• On ne déclare pas le compteur;
 WHILE:
WHILE condition LOOP
instructions;
END LOOP;
 Boucles imbriquées:
• On peut imbriquer des boucles à plusieurs niveaux;
• Il est conseillé d’utiliser des étiquettes
BEGIN
étiquette 1
LOOP ……………..
étiquette 2
LOOP ……..
*EXIT étiquette 1 WHEN ……..
EXIT étiquette 2 ……….
END LOOP étiquette 2;
……….
END LOOP étiquette 1;
END;

Vous aimerez peut-être aussi