Aller au contenu

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;