Le traitement¶
Le PL/SQL permet d’écrire des programmes structurés pour manipuler les données d’une base Oracle.
- Ajoute des fonctionnalités au SQL
- Génère un seul accès à la BD pour tout le bloc
- Un bloc peut être anonyme ou nommé
Variables et types¶
Les variables se déclarent dans la section DECLARE d’un bloc PL/SQL.
DECLARE
nomVariable [CONSTANT] type [NOT NULL][:=initialisation]
BEGIN
...
END;
/
- Nom: max 30 caractères
- CONSTANT (facultatif): si la variable ne peut changer de valeur
- Type: format de stockage (obligatoire)
- NOT NULL (facultatif): si la variable ne peut contenir NULL
- := : Initialisation facultative, mais recommandée
Quelques types de base¶
- NUMBER(n)
- CHAR(n)
- VARCHAR2(n)
- DATE
- BOOLEAN
Exemples simples de déclaration :
total NUMBER;
prixTotal NUMBER(6,2);
estActif CHAR := 'F';
nomUtilisateur VARCHAR2(50);
dateNaissance DATE;
estTermine BOOLEAN := FALSE;
Le type RECORD¶
Le type RECORD représente un enregistrement (équivaent d'une ligne d'une table).
On doit d'abord le déclarer comme type pour pouvoir ensuite l'utiliser.
✏ Ceci peut être comparé aux objets littéraux en Programmation Objet.
Exemple :
DECLARE
TYPE rec_personne IS RECORD (
nom VARCHAR2(30),
age NUMBER(2)
);
unePersonne rec_personne;
BEGIN
unePersonne.nom := 'Alex';
unePersonne.age := 25;
END;
/
Les types dérivés¶
Les types dérivés %TYPE et %ROWTYPE sont utiles pour attribuer le type exact d'une colonne d'une table ou créer un RECORD qui reprend exactement les colonnes d'une table.
%TYPE
- Permet de reprendre le type d’une colonne de table
- Évite les erreurs si le type change dans la table
Exemple de déclaration :
nomEmploye employes.nomEmploye%TYPE;
%ROWTYPE
- Représente toute une ligne d’une table
- Utile pour manipuler des enregistrements complets
Exemple de déclaration :
unEmploye employes%ROWTYPE;
Exemple en utilisation :
DECLARE
noReference CHAR(10);
nouveauPrix articles.prixArticle%TYPE;
unClient clients%ROWTYPE;
BEGIN
--Mise à jour d'un prix
nouveauPrix := 32 * 0.14975
UPDATE Articles
SET prixArticle = nouveauPrix
WHERE noArticle = 2345;
-- sélection d'un enregistrement
SELECT * INTO unClient
FROM clients WHERE nocli = 555;
END;
/
Quelques opérateurs¶
Les opérateurs sont sensiblement les mêmes en programmation PL/SQl, sauf pour quelques exceptions :
| Opération | Opérateur | Exemple |
|---|---|---|
| Affectation | := | age := 18; |
| Addition, Soustraction | + , - | y := y + 3; |
| Multiplication, Division | * , / | total := prix * quantite; |
| Priorité | ( ) | y := (x+5) * y; |
| Concaténation | ||
| Fonctions Oracle | Round(), AVG(), etc. | prixAroudi := ROUND(prixProduit); |
| Affectation d'un SELECT | INTO | nom VARCHAR2(30); SELECT nomFabricant INTO nom FROM fabricant; |
ATTENTION: SELECT ... INTO s'utilise lorsque le SELECT ne retourne qu'une seule valeur par variable !
Les conditions IF¶
La structure IF permet d’exécuter des instructions selon une condition.
Opérateurs :
| Opération | Opérateurs |
|---|---|
| Comparaison égal | = |
| Différent de | != ou <> |
| Plus petit, plus grand... | <, >, <=, >= |
| Vérifier NULL | IS NULL |
| Entre 2 valeurs | BETWEEN |
| Comparaison de chaînes | LIKE avec % ou _ |
| Et Logique | AND |
| Ou Logique | OR |
| Négation | NOT |
Syntaxe :
IF...THEN
END IF;
Condition simple :
IF age >= 18 THEN
etat := 'Majeur';
END IF;
Condition double :
IF statut = 'Etudiant' AND nbHeuresCours >= 12 THEN
etat := 'Etudiant temps plein';
END IF;
Si..sinon :
IF note >= 60 THEN
resultat := 'Réussi';
ELSE
resultat := 'Échec';
END IF;
Si... sinon si... sinon :
IF note >= 80 THEN
mention := 'Excellent';
ELSIF note >= 60 THEN
mention := 'Bien';
ELSE
mention := 'Insuffisant';
END IF;
Les boucles¶
Les boucles permettent de répéter des instructions.
Elles sont particulièrement utiles lorsqu'on doit traverser les enregistrements d'une table ou effectuer des insertions multiples.
Boucle FOR¶
Utile lorsque le nombre d’itérations est connu (ou contenu dans une variable)
NOTE : le compteur est automatiquement déclaré dans le FOR
FOR i IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE(i);
END LOOP;
Boucle WHILE¶
- Boucle tant qu’une condition est vraie, si elle est fausse en partant, alors n'entre jamais dans la boucle
- Condition testée avant chaque itération
compteur := 1;
WHILE compteur <= 5 LOOP
DBMS_OUTPUT.PUT_LINE(compteur);
compteur := compteur + 1;
END LOOP;
Boucle LOOP¶
- ⚠ Boucle infinie si aucune sortie n’est prévue
- Utilise EXIT pour sortir
Peu utilisée ! Surtout si le FOR ou le WHILE peuvent être utilisés à la place.
v_compteur := 1;
LOOP
DBMS_OUTPUT.PUT_LINE(v_compteur);
v_compteur := v_compteur + 1;
EXIT WHEN v_compteur > 5;
END LOOP;