0% ont trouvé ce document utile (0 vote)
18 vues47 pages

Postgre SQL4

Transféré par

Yvann Assale
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
18 vues47 pages

Postgre SQL4

Transféré par

Yvann Assale
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 47

PostgreSQL PL/pgSql

◼ Présentation
o Tous les SGBD fournissent un langage procédural
qui complète le langage SQL:
✓PL/pgSQL pour PostgreSQL
✓PL/SQL pour Oracle
✓SQL/PSM pour MySQL
o Le langage procédural permet de:
✓déclarer des variables
✓utiliser des structures de controles
✓écrire des procédures – fonctions et déclencheurs

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 1


PostgreSQL PL/pgSQL
◼ éléments du langage
o Le bloc PL/pgSQL est composé de 3 sections
✓Syntaxe:
• [<<nom-bloc>>]
[DECLARE
Déclaration de variables, constantes, curseurs, …]
BEGIN
Instructions SQLet PL/pgSQL
Exception

END ; ou [END nom-bloc;]
• Chaque instruction d’une section est terminée par un point virgule (;)
• Dans la section BEGIN, possibilité d’inclure des sous-blocs
• Le block anonyme est encadré de simple quote (). Si à l’intérieur du
2
block on doit utiliser les quotes, on les double
PostgreSQL PL/pgSQL
◼ éléments du langage
o Le bloc PL/pgSQL est composé de 3 sections
✓Exemple :
'<<first_block>>
declare
film_count integer := 0;begin
-- get the number of films
select count(*)
into film_count from film;
-- display a message
raise notice ''The number of films is %'', film_count;
end first_block';
• Pour éviter de doubler les quotes ou utiliser des caractères
d’échappement on utilise le double dollar : $$
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 3
PostgreSQL PL/pgSQL
◼ éléments du langage
o Le bloc PL/pgSQL est composé de 2 sections
do $$
✓Exemple : <<first_block>>
declare
film_count integer := 0;begin
-- get the number of films
select count(*)
into film_count from film;
-- display a message
raise notice 'The number of films is %', film_count;
end first_block $$;
• Depuis la version 9, un do est placé devant le block
• Exécution d’un block dans psql, soit :
❑ On copie le block, puis on le colle dans le shell pgsql
❑ On exécute le block depuis un fichier par \i chemin/nom_fichier
PostgreSQL PL/pgSQL
◼ éléments du langage
o Le bloc PL/SQL
• Possibilité de placer des commentaires:
-- commentaires sur une ligne
/* commentaires sur plusieurs lignes */
✓Instructions SQL utilisables dans un bloc:
• partie LID : SELECT
• partie LMD :INSERT, UPDATE, DELETE,
• partie gestion des transactions : Commit, ROLLBACK
• fonctions : cast(expr as type_dest), …

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 5


PL/SQL
◼ éléments du langage
o Opérateurs
✓Arithmétiques : +, -, *, /, % (modulo), (…)
✓Chaînes de caractères : || (concaténation)
✓De comparaison :
• =, >, >=, !, <, <=, !>, !<, <>, !=, IN, IS NULL,
• LIKE masque, BETWEEN min AND Max
❑ masque : _ un caractère, % n caractères, [ab…] un caractère dans la
liste ab, [a-z] un caractère dans l’intervalle a-z, [^ab…] un caractère
en dehors de la liste
✓Logiques : OR, AND, NOT
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 6
PostgreSQL PL/pgSQL
◼ éléments du langage
o Variables locales
✓Se déclare dans la section DECLARE
✓scalaires
• Syntaxe: nom_variable type;
• Types utilisés: tous les types de SQL et les suivants BOOLEAN,
SMALLINT, DOUBLE, INTEGER, REAL, …
• Variable de meme type qu’une colonne de table:
nom_variable nom_table.nom_colonne%type;
✓Composées
• Variable de même structure qu’une ligne d’une table:
nom_variable nom_table%rowtype;
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 7
PL/SQL
◼ éléments du langage
o Variables locales
✓Composées
• Variable de type RECORD
❑ Déclaration de la variable de type enregistrement:
nom_variable Record;
❑ Elle est identique à une variable de type ligne (ROWTYPE)
✓Constantes
• Syntaxes de déclaration
❑ nom_variable CONSTANT type := valeur ;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 8


PostgreSQL PL/pgSQL
◼ éléments du langage
o Valorisation des variables
✓Opérateur d’affectation « := »
• Dans les 3 sections DECLARE BEGIN et EXCEPTION
✓Dans l’ordre Select … Into dans la section BEGIN
• SELECT col1, col2, …
INTO var1,var2, … [ou variable_type_record]
FROM table [WHERE condition …];
• La clause INTO est obligatoire et le Select doit renvoyer
une et une seule ligne
✓Lorsdu traitement d’un curseur dans la section
BEGIN
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 9
PostgreSQL PL/pgSQL
◼ éléments du langage
o Erreurs et messages
✓Rapporter des messages
• Syntaxe :
raise <level> <format>;
❑ <level> : option définissant niveau de gravité de l’erreur et peut
être:
debug – log – notice – info – warning – exception
la valeur par défaut est exception
❑ <format> : est une chaine de caractères spécifiant le message, il
utilise le symbole « % » pour substituer les arguments

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 10


PostgreSQL PL/pgSQL
◼ éléments du langage
o Erreurs et messages
✓Rapporter des messages
• Exemple :
do $$
begin
raise info 'information message %', now() ;
raise log 'log message %', now(); info: information message 2015-09-10 21:17:39.398+07
raise debug 'debug message %', now(); warning: warning message 2015-09-10 21:17:39.398+07
raise warning 'warning message %', now(); notice: notice message 2015-09-10 21:17:39.398+07
raise notice 'notice message %', now();
end $$;
❑ Noter que c’est seulement les informations de niveau info –
warning et notice qui sont reportées au client

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 11


PostgreSQL PL/pgSQL
◼ éléments du langage
o Erreurs et messages
✓Lever des erreurs
• Syntaxe :
raise [exception] <format>;
derrière la syntaxe l’on peut ajouter des informations par la
clause suivante : using <option> = expression;
<option> pouvant être :
❑ message : définir le message d’erreur
❑ hint : fournir un message pour mieux découvrir la cause de l’erreur
❑ detail : donner plus de détail sur l’erreur
❑ errcode : identifier le code de l’erreur

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 12


PostgreSQL PL/pgSQL
◼ éléments du langage
o Erreurs et messages
✓Lever des erreurs
• Exemple :
do $$
declare
email varchar(255) := '[email protected]';
begin
ERROR: Duplicate email: [email protected]
-- check email for duplicate
HINT: Check the email again
-- ...
CONTEXT: PL/pgSQL function inline_code_block line 8 at
-- report duplicate email
RAISE
raise exception 'duplicate email: %', email
using hint = 'check the email again';
end $$;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 13


PostgreSQL PL/pgSQL
◼ éléments du langage
o Instruction Assert
✓Raccourci utile pour insérer du code de vérifications
de débogage
• Syntaxe :
assert <condition> [, <message>];
❑ <condition> : expression booléenne attendue à retourner vrai
si l’expression renvoie vrai rien ne se passe sinon le système lève
une exception assert_failure
❑ <message> : le message à afficher en cas d’assertion fausse, s’il est
omis le message par défaut de « assertion failed » est utilisé
• L’on peut désactiver les assertions via la configuration de
paramètres dans plpgsql.check_asserts
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 14
PostgreSQL PL/pgSQL
◼ éléments du langage
o Instruction Assert
✓Raccourci utile pour insérer du code de vérifications
de débogage
• Exemple1 :
do $$
declare
nbre_etud integer;
begin
select count(*) Aucun message affiché
into nbre_etud
from etudiant;

assert nbre_etud > 0, 'Etudiant pas trouvé, vérifier la


table Etudiant';
end$$;
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 15
PostgreSQL PL/pgSQL
◼ éléments du langage
o Instruction Assert
✓Raccourci utile pour insérer du code de vérifications
de débogage
• Exemple2 :
do $$
declare
nbre_etud integer;
ERROR: pas plus de 1000 etudiants trouves, verifier la table Etudiant
begin
CONTEXT: PL/pgSQL function inline_code_block line 9 at ASSERT
select count(*)
into nbre_etud
from etudiant;

assert nbre_etud > 1000, ‘pas plus de 1000 etudiants trouves, verifier la table Etudiant';
end$$;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 16


PostgreSQL PL/pgSQL
◼ éléments du langage
o Structures de contrôles
✓Instruction IF
❑ IF condition1 THEN traitement1 ;
[ELSIF condition2 THEN traitement2 ;
ELSE traitement3 ;]
END IF ;
✓Instruction Case : 1ère forme
❑ CASE expression
WHEN expr11 [, expr12 …] THEN instructions1 ;
WHEN expr21 [, expr22 …] THEN instructions2 ;

ELSE instructionsN ;
END CASE ;
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 17
PostgreSQL PL/pgSQL
◼ éléments du langage
o Structures de contrôles
✓Instruction Case : 2ème forme
❑ CASE
WHEN expr_booleen1 THEN instructions1 ;
WHEN expr_booleen2 THEN instructions2 ;

ELSE instructionsN ;
END CASE ;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 18


PostgreSQL PL/pgSQL
◼ éléments du langage
o Structures de contrôles
✓Boucle de base
❑ [<<label>>]
LOOP
instructions ;
END LOOP [label];
❑ On sort de la boucle par : EXIT [label] [WHEN condition]
✓Boucle FOR
❑ [<<label>>]
FOR indice IN [REVERSE] exp1..exp2 [par_pas] LOOP
instructions
END LOOP [label] ;
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 19
PostgreSQL PL/pgSQL
◼ éléments du langage
o Structures de contrôles
✓Boucle While
❑ [<<label>>]
WHILE condition LOOP
instructions ;
END LOOP [LABEL] ;
✓Noter que : exit [label] when condition; permet de
sortir d’une boucle loop, while loop ou for loop
✓Ls sortie d’un block peut se faire par : exit nom_block;
✓L’instruction continue [label] when condition; existe

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 20


PostgreSQL PL/pgSQL
◼ éléments du langage
o Les curseurs
✓Déclaration
• Syntaxe curseur non lié
❑ nom_curseur refcursor;
• Syntaxe curseur lié
❑ nom_curseur [ [no] scroll] cursor [(para1 type1, para2 type2, …)]
for requête;
✓Ouverture
• Syntaxe curseur non lié
❑ open nom_curseur [ [no] scroll] for requête;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 21


PostgreSQL PL/pgSQL
◼ éléments du langage
o Les curseurs
✓Ouverture
• Syntaxe curseur lié
❑ open nom_curseur [ (para1:=valeur1, para2:=valeur2, …)] ;
✓Traitement des lignes
• Syntaxe pour récupérer une ligne :
❑ fetch [direction {from | in}] nom_ curseur INTO {liste_ variables |
variable_ligne | variable_record};
❑ Si la valeeur <not found> est à true, il n’y a plus de lignes à
récupérer
fetch cur_etutiant into row_etudiant;
❑ Exemples : fetch last from cur_etudiant into matricule, nom_etud;
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 22
PostgreSQL PL/pgSQL
◼ éléments du langage
o Les curseurs
✓Traitement des lignes
• Syntaxe pour déplacer le curseur sans récupérer de lignes :
❑ move [direction {from | in}] nom_curseur;
❑ Exemples :
move cur_etud22;
move last from cur_etud;
move relative -1 from cur_etud;
move forward 3 from cur_etud;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 23


PostgreSQL PL/pgSQL
◼ éléments du langage
o Les curseurs
✓Suppression et Mise à jour de la table à travers curseur
• Requete Update ou Delete avec clause where de la forme:
where current of nom_curseur;
✓Fermeture du curseur
• Syntaxe :
❑ close nom_curseur;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 24


PostgreSQL PL/pgSQL
◼ éléments du langage
o Les curseurs
✓Parcours de toutes les lignes du curseur avec For
• [<<label>>]
FOR ma_structure IN nom_curseur [(val_para)]Loop

End loop [label];
✓Avantages
• Variable ma_structure pas besoin d’être déclarée
• pas besoin de OPEN nom_curseur
• pas besoin de FETCH ni CLOSE nom_curseur
• ADJE LOUIS
ASSALE PostgreSQL PL/pgSQL 25
PostgreSQL PL/pgSQL
◼ éléments du langage
o Gestion des exceptions
✓Erreur dûe à l’utilisateur
❑ DECLARE


BEGIN


EXCEPTION
WHEN {condition | nom_erreur | sqlstate code} THEN
traitements ;
When … then ...;
END ;
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 26
PostgreSQL PL/pgSQL
◼ éléments du langage
o Gestion des exceptions
✓Quelques noms d’exception et code sqlstate
• division_by_zero 22012
• invalid_datetime_format 22007
• integrity_constraint_violation 23000
• invalid_cursor_state 24000
• invalid_cursor_name 34000
• no_data_found P0002
• Too_many_rows P0003
• raise_exception P0004
27
• others toutes les autres erreurs non explicitement nommées
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonction
✓Procédure
• CREATE [OR REPLACE] PROCEDURE nom_procedure
([mode] para1 type1,…) language plpgsql as $$
declare
[déclarations de variables locales]
BEGIN
instructions
END; $$
• Mode: in – out – inout

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 28


PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonctions
✓Procédure exemple:
• CREATE OR REPLACE PROCEDURE rendre_livre
(IN N_livre NUMERIC(5), IN date_retour DATE)
language plpgsql AS $$
BEGIN
UPDATE emprunt
SET retour = date_retour
WHERE N_liv# = N_livre and retour is NULL;
END; $$

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 29
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonctions
✓fonction
• CREATE [OR REPLACE] FUNCTION nom_fonction
([mode] para1 type1,…) RETURNS type_de_données
language plpgsql AS $$
DECLARE
[déclarations de variables locales]
BEGIN
instructions
RETURN(expression) ;
END; $$
• ADJE LOUIS
ASSALE PostgreSQL PL/pgSQL 30
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonctions
✓Fonction exemple:
• CREATE OR REPLACE FUNCTION lecture_prix
(IN N_livre NUMERIC(5,2))RETURN number (5,2)
language plpgsql AS $$
DECLARE
Lect_prix number(5,2);
BEGIN
SELECT prix INTO lect_prix FROM Livre
WHERE N_liv # = N_livre;
RETURN (lect_prix);
END; $$ 31
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonctions
✓Fonction retournant une table
• CREATE [OR REPLACE] FUNCTION nom_fonction
([mode] para1 type1,…) RETURNS TABLE
(liste_colonne) language plpgsql AS $$
DECLARE
[déclarations de variables locales]
BEGIN
instructions;
END; $$

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 32
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonctions
✓Fonction exemple:
• CREATE OR REPLACE FUNCTION bon_etudiant
(IN note_seuil NUMERIC(5,2))RETURNS TABLE (lenum
varchar, lenom varchar, lecode_cl varchar)
language plpgsql AS $$
BEGIN
Return query
select e.num, nom, code_cl from etudiant e, suit s
Where e.num=s.num and note>=note_seuil)
END; $$;
• 33
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Procédures et fonctions
✓Exécution à partir de shell psql:
• Procédure
❑ Call nom_procedure(liste de paramètres effectifs);
• Fonction
❑ Select * from nom_fonction(liste de paramètres effectifs);
✓Exécution à partir d’un autre objet applicatif
• Appel normal de procédure et fonction

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 34


PostgreSQL PL/pgSQL
◼ objets applicatifs
o Package
✓Regroupe un ensemble d’objets applicatifs ayant des
liens logique entre eux
✓Il se comporte comme un schéma, il ne contient que
des définitions de fonctions, procédures et types
composés

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 35


PostgreSQL PL/pgSQL
◼ Travaux Pratiques N°1
o 1. Ecrire une fonction qui prend en paramètre un
entier n et qui affiche sa table de multiplication.
o 2. Afficher les nième et n+1ième bons étudiants toute
matière confondue en utilisant un fichier de
commandes.

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 36


PostgreSQL PL/pgSQL
◼ Travaux Pratiques N°1
o 3. Ecrire une procédure qui prendre en paramètre
le nom d’un étudiant et :
✓1) affiche les notes de l’étudiant dans chacune de ses
matières (requête SQL)
✓2) affiche la moyenne des notes pour les matières dans
lesquelles l’étudiant est intervenu (requête SQL)

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 37


PostgreSQL PL/pgSQL
◼ Travaux Pratiques N°1
o 3. suite :
✓4) effectue la mise à jour de la note de l’étudiant :
• - si sa note est comprise entre la note moyenne et 100 alors
augmenter sa note de 10%
• - sinon lui donner la note moyenne comme nouvelle note.

(bloc PL/pgSQL)
✓5) réaffiche les notes de l’étudiant dans ses matières
(requête SQL)

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 38


PostgreSQL PL/pgSQL
◼ Travaux Pratiques N°2
o 1. Ecrire une fonction numero qui renvoie le
numéro d’un étudiant.
o 2. Ecrire une procédure augmente qui augmente la
note d’un étudiant de nom x d’une valeur y pour
une matière z. on utilisera la fonction numero.
o 3. Ecrire les fonctions suivantes :
moyenne(lenom) et moyenne(laclasse, lamatière)

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 39


PostgreSQL PL/pgSQL
◼ Travaux Pratiques N°2
o 4. Ecrire les procédures suivantes :
inscrire(étudiant, classe, sexe),
suivre(étudiant, matière, date_s),
avoir_note(étudiant, matière, valeur),
renvoi(étudiant) et
modif_classe(étudiant, nouv_classe)

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 40


PostgreSQL PL/pgSQL
◼ objets applicatifs
o Déclencheurs
✓Caractéristiques des déclencheurs PostgreSQL
• Peut se déclencher pour l’événement TRUNCATE
• Permet de définir des instructions sur des vues
• La définition du déclencheur se fait en 2 étapes :
❑ Définir une fonction qui va contenir les actions du déclencheur
❑ Définir un ou plusieurs déclencheurs à lier à la fonction

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 41


PostgreSQL PL/pgSQL
◼ objets applicatifs
o Déclencheurs
✓Syntaxe : 1° étape création de la fonction
• la fonction n’a pas d’arguments et elle retourne le type
« trigger »
• Create function fonction_trigger()
returns trigger
language plpgsql As $$
Le « return » dans le corps de la fonction :
Begin - Return Null;
… - Return Old;
- Return New;
End; $$; - Ou autre

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 42


PostgreSQL PL/pgSQL
◼ objets applicatifs
o Déclencheurs
✓Syntaxe : 2° étape création du déclencheur et liaison à
la fonction trigger
• Create trigger nom_trigger
{Before | After} {événement}
on nom_table
[for [each] {Row | Statement}]
[when (condition)]
execute procedure fonction_trigger();
• Les événements sont séparés par des OR, pour Update on
peut préciser des noms de colonnes : Update of nomcol, …
• For each row/statement : déclencheur par ligne/ordre 43
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Déclencheurs
✓Variables spéciales créées lors de l’appel de trigger
• NEW type de données RECORD; variable contenant la
nouvelle ligne pour les opérations Insert/Update
• OLD type de données RECORD; variable contenant
l’ancienne ligne pour les opérations Delete/Update
• TG_NAME type de données name; variable contenant le
nom du trigger réellement lancé
• TG_WHEN type de données text; un chaine soit BEFORE
soit AFTER soit INSTEAD OF selon la définition du
trigger
ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 44
PostgreSQL PL/pgSQL
◼ objets applicatifs
o Déclencheurs
✓Variables spéciales créées lors de l’appel de trigger
• TG_LEVEL type de données text; une chaine, soit ROW
soit STATEMENT selon la définition du trigger
• TG_OP type de données text; une chaine, INSERT,
UPDATE, DELETE ou TRUNCATE indiquant l’opération
• TG_TABLE_NAME type de données name; nom de la
table qui déclenché le trigger
• TG_OP type de données oid; l’ID de l’objet de la table qui a
causé le déclenchement du trigger

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 45


PostgreSQL PL/pgSQL
◼ objets applicatifs
o Déclencheurs
✓Exemple

Create or replace function modif_suit()


create or replace trigger lamodifnote
returns trigger
After update of note
language plpgsql As $$
on suit
BEGIN
for each row
insert into modifier values(OLD.num, OLD.mat,
execute procedure modif_suit();
OLD.note, Now());
return Null;
end; $$;

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 46


PostgreSQL PL/pgSQL
◼ Travaux Pratiques N°3
o 5. Ecrire un trigger modif_note qui avant la
modification d’une note met à jour le champ
date_ob à la date système (Now()).
o 6. Ecrire un trigger modif_effectif qui met à jour
l’effectif des classes après une insertion,
suppression et modification de la classe d’un
étudiant.

ASSALE ADJE LOUIS PostgreSQL PL/pgSQL 47

Vous aimerez peut-être aussi