Systèmes de Gestion de Bases de Données Procedural ...
Transcript of Systèmes de Gestion de Bases de Données Procedural ...
![Page 1: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/1.jpg)
Systèmes de Gestion de
Bases de Données
Procedural Language (PL)/SQL
![Page 2: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/2.jpg)
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, ...)
![Page 3: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/3.jpg)
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
![Page 4: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/4.jpg)
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
![Page 5: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/5.jpg)
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
![Page 6: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/6.jpg)
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
![Page 7: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/7.jpg)
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)
![Page 8: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/8.jpg)
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
![Page 9: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/9.jpg)
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');
![Page 10: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/10.jpg)
Systèmes de Gestion de Bases de Données 10
Le langage procédural PL/pgSQL
![Page 11: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/11.jpg)
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)
![Page 12: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/12.jpg)
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
![Page 13: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/13.jpg)
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 ;
![Page 14: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/14.jpg)
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
![Page 15: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/15.jpg)
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
![Page 16: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/16.jpg)
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é
![Page 17: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/17.jpg)
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 ;
![Page 18: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/18.jpg)
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)
![Page 19: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/19.jpg)
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
![Page 20: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/20.jpg)
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, ...
![Page 21: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/21.jpg)
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
![Page 22: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/22.jpg)
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;
![Page 23: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/23.jpg)
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;
![Page 24: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/24.jpg)
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;
![Page 25: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/25.jpg)
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;
![Page 26: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/26.jpg)
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;
![Page 27: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/27.jpg)
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;
![Page 28: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/28.jpg)
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;
![Page 29: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/29.jpg)
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;
![Page 30: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/30.jpg)
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
![Page 31: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/31.jpg)
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 …
![Page 32: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/32.jpg)
Systèmes de Gestion de Bases de Données 32
Les curseurs explicites (1)● 4 étapes:
– déclaration – ouverture – traitements des lignes– fermeture
![Page 33: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/33.jpg)
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;
![Page 34: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/34.jpg)
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 ...;
![Page 35: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/35.jpg)
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;
![Page 36: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/36.jpg)
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
![Page 37: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/37.jpg)
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
![Page 38: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/38.jpg)
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
![Page 39: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/39.jpg)
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,.. .);
![Page 40: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/40.jpg)
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;
![Page 41: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/41.jpg)
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 !
![Page 42: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/42.jpg)
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
![Page 43: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/43.jpg)
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;
![Page 44: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/44.jpg)
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– ...
![Page 45: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/45.jpg)
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);
![Page 46: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/46.jpg)
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
![Page 47: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/47.jpg)
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);
![Page 48: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/48.jpg)
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
![Page 49: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/49.jpg)
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;
![Page 50: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/50.jpg)
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
![Page 51: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/51.jpg)
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
![Page 52: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/52.jpg)
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;
![Page 53: Systèmes de Gestion de Bases de Données Procedural ...](https://reader035.fdocuments.net/reader035/viewer/2022062409/62aca87da0c1cc4c3719aff5/html5/thumbnails/53.jpg)
Systèmes de Gestion de Bases de Données 53
La suite en TP ...