Systèmes de Gestion de
Bases de Données
Procedural Language (PL)/SQL
Systèmes de Gestion de Bases de Données 2
Introduction● SQL langage simple de manipulation des données
=> possibilité de requêtes longues et complexes● Architecture client/serveur et bloc d'instructions:
– ex. serveur web / SGBDR: le client doit envoyer une ou plusieurs requêtes au serveur, attend les résultats, les traitent, et renvoie si nécessaire d'autres requêtes au serveur
● Allers/retours de requêtes entre le client et le serveur● Surcharge du réseau● Attente du client
● Le langage SQL ne contient pas les fonctionnalités d'un langage évolué (boucles, variables, ...)
Systèmes de Gestion de Bases de Données 3
PL/SQL en bref (1)● Procedural Language/SQL● PL-SQL comprend :
– la partie interrogation de SQL (Select, …) – la partie manipulation de SQL (Update, Insert,
Delete, …)
● PLUS :– une partie procédurale (des conditionnelles, des
boucles, des variables, des affectations, …)
PL/SQL est un langage algorithmique complet
Systèmes de Gestion de Bases de Données 4
PL/SQL en bref (2)● Apport de PL/SQL
– Permet de créer des blocs d'instructions– Dans une architecture client/serveur SGBDR
permet d'améliorer la qualité de l'application:● Le traitement relatif à la BD est centralisé au niveau
du SGBDR● Réduit les allers/retours entre le client et le serveur
SGBDR● Seuls les résultats du traitement sont renvoyés, si
nécessaire au client
Systèmes de Gestion de Bases de Données 5
PL/SQL en bref (3)● Quelques instructions « proches » de SQL:
– MANIPULATION: SELECT, INSERT, UPDATE, DELETE , …
– TRANSACTIONS: COMMIT, ROLLBACK, SAVEPOINT, SET TRANSACTION, LOCK TABLE, …
– FONCTIONS: TO_CHAR, TO_DATE, UPPER, SUBSTR, ROUND, ...
– CURSEURS : DECLARE, OPEN, FETCH, ...
● Des instructions propres à PL/SQL
● Impossible en PL/SQL: create table ou user, alter, drop table ou user
Systèmes de Gestion de Bases de Données 6
PL/SQL et les SGBDR● Oracle:
– PL/SQL est le langage procédural d'Oracle– Syntaxe propre
● PostgreSQL:– PL/SQL est le langage procédural de PostgresSQL– Syntaxe issue d'autres langages de programmation:
● Soit intégrée: PL/C ● Soit fournie dans la distribution de PostgreSQL mais
à installer: PL/pgSQL (syntaxe proche du PL/SQL d'Oracle), PL/Tcl (syntaxe du TCL/TK), PL/Perl, PL/Python
● Soit maintenue en externe: PL/java, PL/php, PL/ruby, PL/scheme, PL/sh, ...
● MySQL: pas encore disponible
Systèmes de Gestion de Bases de Données 7
PL/SQL et PostgreSQL (1)● Objectifs de PL/SQL dans postgreSQL = définir
des blocs d'instructions dans un langage SQL plus évolué que SQL:– créer des fonctions supplémentaires en plus des
fonctions internes et C existantes– utiliser la puissance d'autres langages de
programmation● Fonctionnement:
– Pas d'interpréteur intégré pour la compilation– Modules externes chargés de la compréhension et
la compilation des autres langages (gestionnaires écrit en C)
Systèmes de Gestion de Bases de Données 8
PL/SQL et PostgreSQL (2)● Définition du code PL/SQL dans une fonction SQL
CREATE [ OR REPLACE ] FUNCTION nom ( [ [ mode_arg ] [ nom_arg ] type_arg [, ...] ] ) [ RETURNS type_retour ] { LANGUAGE nom_langage | IMMUTABLE | STABLE |
VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AS 'definition' | AS 'fichier_objet', 'symbole_lien'
} ... [ WITH ( attribut [, ...] ) ]
● Appel de la fonction dans une requête SQL
Systèmes de Gestion de Bases de Données 9
PL/SQL et PostgreSQL (3)● Exemple de définition
CREATE OR REPLACE FUNCTION my_funct(param1 integer, param2 numeric, param3 varchar(20)) returns integer as $$
bloc d'instructions basées sur la syntaxe du langage spécifié ci-dessous
$$ LANGUAGE plpgsql;● Exemples d'appel de la fonction suivant le type de
données renvoyéselect my_funct(5, 10, 'my_text');select * from my_funct(5, 10, 'my_text');
Systèmes de Gestion de Bases de Données 10
Le langage procédural PL/pgSQL
Systèmes de Gestion de Bases de Données 11
Structure du langage PL/pgsql (1)● À l'intérieur de la fonction, blocs d'instruction:
DECLARE (FACULTATIF)Déclaration des variables, constantes, exceptions et curseurs
BEGIN (OBLIGATOIRE)Instructions PL/SQLPossibilité de BLOCS imbriqués
EXCEPTION (FACULTATIF)Traitement des exceptions (gestion des "erreurs")
END; (OBLIGATOIRE)
Systèmes de Gestion de Bases de Données 12
Structure du langage PL/pgsql (2)● Imbrication possibles des blocs (sauf dans la
partie declare)● Nommage des blocs possibles pour référencement
<<nom_bloc>>BEGIN
InstructionsEND nom_bloc ;
● Si bloc vide, begin optionnel, end obligatoire
Systèmes de Gestion de Bases de Données 13
Structure du langage: Exemple● Chaque instruction est
terminée par un ; ● Les LABELS tels les
étiquettes de saut sont notés : <<LABEL>>
● Et les commentaires !-- comments Ou /* comments */
<<bloc1>>--- ceci est le bloc 1DECLARE
x numeric ;BEGIN
Instructions…
END bloc1 ;
<<bloc2>>/* Ceci est le bloc 2 */DECLAREx numeric ;BEGIN if x = bloc1.x then … end if;END bloc2 ;
Systèmes de Gestion de Bases de Données 14
Les variables (1)● 2 grands types de variables en PL/pgSQL
– Variables de types postgreSQL : char, numeric, integer, date (DD-MON-YY), boolean…
– Variables propres à PL/pgSQL :● Types composites : record et table● Types références : cursor● Variable FOUND
Systèmes de Gestion de Bases de Données 15
Les variables (2)● Définition des variables PL/SQL
– Dans la partie DECLARE du bloc PL/SQL.– Déclaration conventionnelle ou :
● Référence au type d'une colonne d'une table avec le type: nom_table.nom_colonne%TYPE
● Référence au type d'une ligne d'une table avec le type: nom_table%ROWTYPE
● Référence au type d'une ligne d'un curseur avec le type (dépend de la version de postgresql): nom_curseur%ROWTYPE
● Référence au type d'une variable (précédemment définie) avec le type : nom_var%TYPE
Systèmes de Gestion de Bases de Données 16
Les variables (3)● Affectation des variables
– soit avec l'opérateur := suivi d'une constante, d'une expression ou d'une fonction PL/SQL
X := 5 ; tot := &SQ+3 ; Y := double(123) ;– soit lors de la commande PL/SQL select avec
l'opérateur into SELECT colonne INTO variable FROM TABLE;
Attention : (1) si le select retourne plusieurs valeurs il faut
utiliser un curseur(2) l'utilisation d'un select simple n'est pas autorisé
Systèmes de Gestion de Bases de Données 17
Les variables (4)● L'attribut CONSTANT permet de figer l'affectation
d'une variable.Pi CONSTANT REAL := 3.14159 ;
● L'attribut NOT NULL interdit les valeurs nulles. present NOT NULL BOOLEAN := FALSE ;
● Les variables doivent être initialisées, cela peut être fait à la définition.
aire REAL := Pi * Rayon**2 ;
Systèmes de Gestion de Bases de Données 18
Les variables (5)● Portée & visibilité des variables :
– Portée : les variables PL/SQL sont valides uniquement dans le bloc où elles sont déclarées (ainsi que dans les sous-blocs)
– Visibilité : si un sous-bloc déclare une variable de même nom, elle masque celle de niveau supérieur
DECLAREx number ;BEGIN
…DECLAREx real ;BEGIN…END;…
END;
Portée de x (number)
Portée de x (real)
DECLAREx number ;BEGIN
…DECLAREx real ;BEGIN…END;…
END;
Visibilité de x (number)
Visibilité de x (real)
Systèmes de Gestion de Bases de Données 19
Les types de données (1)● Types issus de SQL
– Binary_integer –2.147.483.647 à 2.147.483.647– Numeric(précision, échelle) (38 digits)– Date– Char(longueur) : fixe– Varchar2(longueur) : variable– Long : chaîne de longueur variable– Raw(longueur) : idem varchar2
– + les sous types !!!!– boolean : TRUE ou FALSE ou NULL
Systèmes de Gestion de Bases de Données 20
Les types de données (2)● Variable interne FOUND
– Booléen– Assignée lors de l'appel à certaines fonctions:
select, perform, execute, ...
Systèmes de Gestion de Bases de Données 21
Les types de données (3)● Enregistrements
my_record record;– Regroupement de différentes données (champs)
dans une même structure– Utilisés principalement pour récupérer une ligne
d’une table– Pour accéder aux champs des enregistrements
my_record.nomchamp– Déclaration implicite : depart dept%rowtype
● Enregistrement correspondant à une ligne de la table dept, composé de champs identiques aux attributs de la table
Systèmes de Gestion de Bases de Données 22
Les types de données (4)● Enregistrement: exemple
DECLAREemp_record record;
BEGINselect * into emp_record from emp where ename =
‘JONES’;raise notice 'Nom: %, empno: %', emp_record.ename,
emp_record.empno;END;
Systèmes de Gestion de Bases de Données 23
Les conditionnelles (1)IF condition THEN
traitements
END IF ;DECLARE
salaire emp.sal%type;maxi numeric := 15000;
BEGINselect sal into salaire from emp
where ename = ‘JONES’;IF salaire < maxi THEN
salaire := salaire * 1.2;END IF ;
END;
Systèmes de Gestion de Bases de Données 24
Les conditionnelles (2)IF condition THEN
traitements
ELSE traitements
END IF ;
DECLAREsalaire emp.sal%type;maxi numeric := 15000;
BEGINselect sal into salaire from emp where ename = ‘JONES’;IF salaire < maxi THEN salaire := salaire * 1.2;ELSE
salaire := salaire * 1.1;END IF ;
END;
Systèmes de Gestion de Bases de Données 25
Les conditionnelles (3)IF condition THEN
traitements
ELSIF condition THEN traitements
END IF ;
DECLAREsalaire emp.sal%type;maxi numeric := 15000;
BEGINselect sal into salaire from emp where ename = ‘JONES’;IF salaire < maxi THEN salaire := salaire * 1.2;ELSIF salaire > maxi
salaire := salaire * 1.1;END IF ;
END;
Systèmes de Gestion de Bases de Données 26
Les boucles (1)LOOP [LABEL]
traitementsEND LOOP [LABEL] ;
La commande EXIT [WHEN] permet de sortir de la boucle
DECLAREmaxi numeric := 10;i numeric :=0;
BEGINLOOP
i:=i+1;EXIT WHEN i = maxi;
END LOOP;END;
Systèmes de Gestion de Bases de Données 27
Les boucles (2)FOR var IN [REVERSE] var-debut .. var-fin LOOP
TraitementsEND LOOP ;
● var est une variable pré-définie par la boucle (présence non obligatoire dans le bloc DECLARE
● var-debut et var-fin sont des variables ou des constantes.
● le pas d'incrément est de 1DECLARE
i numeric := 20;maxi numeric : =10;
BEGINfor i in 1..maxi loop
raise notice 'i: %', i;end loop;END;
Systèmes de Gestion de Bases de Données 28
Les boucles (3)FOR var_record IN requête
TraitementsEND LOOP ;● var_record est une variable déclarée de type record
ou %rowtype● var_record contient un ou plusieurs enregistrements
issus de la requêteDECLARE
my_record record;BEGINfor my_record in select * from emp loop
raise notice 'nom: %, empno: %', my_record.ename, my_record.empno;
end loop;END;
Systèmes de Gestion de Bases de Données 29
Les boucles (4)WHILE condition LOOP
traitementsEND LOOP;
● EXIT permet de sortir de la boucle avant la fin
DECLAREi numeric := 0;maxi numeric : =10;
BEGINwhile i < maxi loop
i:=i+1;end loop;
END;
Systèmes de Gestion de Bases de Données 30
Les curseurs (1)● Zones mémoires utilisées:
– pour stocker le résultat d'une requête pour son traitement ultérieur (comportement similaire à la boucle For associée à une requête)
– pour renvoyer un ensemble de données à partir d'une fonction
● L'accès à ces zones mémoires se fait ligne par
ligne
● 3 types de curseurs :– Curseurs implicites– Curseurs explicites
Systèmes de Gestion de Bases de Données 31
Les curseurs (2)● Curseur implicite : généré ET géré par le noyau lui-
même pour l'exécution d'ordres tels que le SELECT, INSERT ou UPDATE – Utilisation des boucles FOR+requête– Totalement transparent pour l’utilisateur
● Curseur explicite : créé et géré par l'utilisateur pour traiter un ordre SELECT qui retourne plusieurs enregistrements – sinon utilisation d’un simple select … into … from …
Systèmes de Gestion de Bases de Données 32
Les curseurs explicites (1)● 4 étapes:
– déclaration – ouverture – traitements des lignes– fermeture
Systèmes de Gestion de Bases de Données 33
Les curseurs explicites: déclaration● 3 déclarations possibles de curseurs:
– Curseurs non liés (à une requête): nom_curseur REFCURSOR;
– Curseurs liés:nom_curseur CURSOR FOR/IS ordre select SQL;
– Curseurs liés paramétrés:nom_curseur CURSOR (param1 type) FOR/IS ordre
select SQL;
Systèmes de Gestion de Bases de Données 34
Les curseurs explicites: ouverture et fermeture (1)● Allocation mémoire faite lors de l’ouverture suivie
d’une analyse sémantique et syntaxique de l'ordre SELECT (les erreurs arrivent ici !)
● Ouverture & fermeture réalisées dans le bloc traitement : OPEN & CLOSE
● Deux formats d'ouverture suivant la nature du curseurs explicites:– Curseurs liés:
Open nom_curseur;– Curseurs non liés – association à la requête:
Open nom_curseur for select ...;
Systèmes de Gestion de Bases de Données 35
Les curseurs explicites: ouverture et fermeture (2)● Exemple
DECLAREmy_curseur refcursor
BEGIN …OPEN my_curseur for select * from emp;
traitementsCLOSE my_curseur;
…END;
Systèmes de Gestion de Bases de Données 36
Les curseurs explicites: traitement des lignes● Traitement ligne à ligne grâce à la commande
fetch ... into● réception des lignes résultat dans des variables
record ou %rowtype définies dans le bloc FETCH nom_curseur INTO malignecurseur ;
● Fetch ne ramène qu'une ligne à la fois● Passe à ligne suivante automatiquement
Systèmes de Gestion de Bases de Données 37
Les curseurs et boucles (1)● Boucle LOOP : utilisation complètement manuelle
des curseurs : – Déclaration– Ouverture – Traitement et Incrémentation par fetch– Arrêt grâce à la variable FOUND– Fermeture
Systèmes de Gestion de Bases de Données 38
Les curseurs et boucles (2)DECLARE
employe CURSOR IS SELECT * from emp;
ligne_emp em%ROWTYPE;BEGIN
OPEN employe; LOOP
FETCH employe INTO ligne_emp ; EXIT WHEN NOT FOUND;raise notice 'nom: %, job: %',
ligne_emp.ename, ligne_emp.job;END LOOP;
CLOSE employe;END;
Déclaration curseur & record
Incrémentation Test de fin
Ouverture
Fermeture
Systèmes de Gestion de Bases de Données 39
Les curseurs paramétrés (1)● Initialisation des paramètres dans la déclaration
des curseurs liés paramétrésnom_curseur cursor (paral type1, para2 type2, ...)
IS SELECT... ; (utilisant les paramètres)
Note : Types donnés sans longueur (char, numeric, varchar2)
● A l'utilisation, il faut donner les valeurs des paramètres:OPEN nom_curseur (val1, val2,.. .);
Systèmes de Gestion de Bases de Données 40
Les curseurs paramétrés (2)DECLARE
employe CURSOR (dep numeric) IS SELECT * from emp where deptno=dep;
ligne_emp em%ROWTYPE;BEGIN
OPEN employe(20); LOOP
FETCH employe INTO ligne_emp ; EXIT WHEN NOT FOUND;raise notice 'nom: %, job: %', ligne_emp.ename,
ligne_emp.job;END LOOP;
CLOSE employe;END;
Systèmes de Gestion de Bases de Données 41
Gestion des erreurs ou exceptions (1)● Permet de réserver un traitement spécifique à
chaque erreur● 2 types d'erreurs :
– les erreurs internes postgreSQL– les erreurs « définies » par l'utilisateur
● Lors d'une erreur, l'exécution s'interrompt et le traitement associé dans le bloc exception s'exécute
● A la fin de l'exécution, le traitement reprend après le bloc exception:– Toutes les instructions prévues dans le bloc begin
end correspondant (hors exception) sont annulées !
Systèmes de Gestion de Bases de Données 42
Gestion des erreurs ou exceptions (2)● Lors de la levée d'une exception, toutes
modifications sur les données des tables à l'intérieur du bloc d'instructions à l'origine de l'exception sont annulées. La base de données revient dans son état initial suite à l'exception
● Suivant le cas, utile d'imbriquer différents blocs d'instruction begin/end pour une meilleure gestion des exceptions
Systèmes de Gestion de Bases de Données 43
Gestion des erreurs ou exceptions (3)
DECLAREBEGIN
BEGIN/* Bloc traitements pouvant lever une exception*/instruction1;instruction2 qui lève l'exception; instruction3 qui ne sera pas exécutée;
EXCEPTIONWHEN condition THEN traitement;WHEN condition THEN traitement;...
END;instruction suivante exécutée;
END;
Systèmes de Gestion de Bases de Données 44
Gestion des erreurs ou exceptions (4)● Différents types d'exception pré-définis =>
différentes conditions possibles dans le WHEN du bloc exception:– Connection failure– Data exception– Integrity constraint violation– Syntax error– ...
Systèmes de Gestion de Bases de Données 45
Gestion des erreurs ou exceptions (5)
Create or replace function div(num real, denom real) returns real as $$
DECLARE y real;
BEGINy := num / denom;raise notice 'y: %', y;return y;exception
when division_by_zero thenraise notice 'denom est egal à %', denom;
return y;END;select div(10,0);
Systèmes de Gestion de Bases de Données 46
Gestion des erreurs utilisateurs (1)● Possibilité de rapporter des messages et lever des
erreurs grâce à la commande raise● Différents niveaux possibles: debug, log, info,
notice, warning et exception● Seul le niveau exception lève une exception au
niveau du système récupérable par le bloc exception:– Condition de test dans le WHEN:
RAISE_EXCEPTION
Systèmes de Gestion de Bases de Données 47
Gestion des erreurs utilisateurs (2)Create or replace function div(num real, denom real) returns
real as $$DECLARE
y real;BEGIN
if denom = 0 then raise exception 'Exception user';end if;y := num / denom;return y;exception
when raise_exception thenraise notice 'denom est egal à %', denom;
return y;END;select div(10,0);
Systèmes de Gestion de Bases de Données 48
Triggers (1)● Trigger=Déclencheur:
– Déclenchement lors d'une opération particulière sur une table: insert, update, delete. Ne peut agir sur un select
– Gestionnaire de déclencheurs● Chaque trigger est associé à une fonction trigger● 2 types de triggers
– Trigger par ligne: fonction trigger appelée pour chaque ligne affectée par l'opération
– Trigger par instruction: fonction trigger appelée une seule fois pour l'ensemble des lignes affectées
● Exécution de la fonction trigger possible avant ou après l'opération
Systèmes de Gestion de Bases de Données 49
Triggers (2)● Définition d'un trigger
CREATE TRIGGER nom { BEFORE | AFTER}{ opération [ OR ...] }ON table [ FOR [ EACH ] { ROW | STATEMENT } ]EXECUTE PROCEDURE nom_fonction ( arguments )
● Destruction d'un triggerDROP TRIGGER nom on nom_table;
● Définition de la fonction triggerCREATE [ OR REPLACE ] FUNCTION nom ( )RETURNS trigger as $$...$$ LANGUAGE plpgsql;
Systèmes de Gestion de Bases de Données 50
Triggers (3)● Définition de la fonction trigger
– Aucun argument possible– Type de retour obligatoire: trigger => retour d'une
valeur NULL ou d'un record● Trigger type BEFORE et par ligne: si retour NULL;
l'opération INSERT ou UPDATE est annulée; si retour d'un enregistrement, il sera utilisé pour l'insertion ou la modification. Pas d'influence sur l'opération delete
● Trigger type AFTER/BEFORE et par instruction ou de type AFTER et par ligne: le type de retour n'a pas de conséquence
– Si une exception est levée pendant l'exécution de la fonction, l'opération associée est annulée
Systèmes de Gestion de Bases de Données 51
Triggers (4)● Variables prédéfinies, créées et affectées par le
gestionnaire de déclencheurs– NEW (record): nouvelle ligne utilisée par
INSERT/UPDATE pour les triggers par ligne– OLD (record): ancienne ligne pour UPDATE/DELETE
pour les triggers en ligne – TG_NAME (name), TG_WHEN (text), TG_LEVEL (text):
informations sur le trigger – nom, type (BEFORE/AFTER), niveau (RAW/STATEMENT)
– TG_OP (text): type d'opération associée au trigger (UPDATE/INSERT/DELETE)
– TG_RELID (OID), TG_RELNAME (name): Id attribut et nom de la table associé au trigger
– TG_NARGS (integer), TG_ARGV[] (text): nombre et liste d'arguments passés lors de la création du trigger
Systèmes de Gestion de Bases de Données 52
Triggers (5)
Create or replace function verif_emp() returns trigger as $$declare
maxval numeric;begin
if(NEW.mgr is NULL) thenselect max(empno) into maxval from emp;NEW.mgr := maxval;
end if;returns NEW;
end;
$$ LANGUAGE plpgsql;
Systèmes de Gestion de Bases de Données 53
La suite en TP ...