SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 1
Nicolas Travers
Équipe Vertigo - Laboratoire CEDRIC
Conservatoire National des Arts & Métiers, Paris, France
Procédures Stockées
Bases de Données
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 2
Contenu du cours
• PL/SQL
▫ Variables
▫ Structures de contrôle
▫ Interaction avec la base et Curseurs
▫ Sous-programmes, paquetages
▫ Exceptions
▫ Transactions
(D après les supports de Michel Crucianu, Cédric du Mouza et Philippe Rigaux)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 3
Bibliographie
Bales, D.K. Java programming with Oracle JDBC. O Reilly, 2002.
Bizoi, R. PL/SQL pour Oracle 10g, Eyrolles. 2006.
Date, C. Introduction aux bases de données. Vuibert, 2004 (8ème édition).
Gardarin, G. Bases de données, Eyrolles. 2003.
Reese, G. JDBC et Java : guide du programmeur. O Reilly, 2001.
Soutou, C. SQL pour Oracle. Eyrolles, 2008 (3ème édition).
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 4
PL/SQL
• Procedural Language / Structured Query Language
▫ PL/SQL : langage propriétaire Oracle
▫ Language procédural :
– Variables, boucles, tests, curseurs, fonctions/procédures,
exceptions
• Syntaxe de PL/SQL inspirée du langage Ada (Pascal)
▫ Avantages de SQL
▫ Programmation en plus
• PL/SQL n est pas très éloigné du langage normalisé
Persistent Stored Modules (PSM)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 5
PL/SQL
• Qui ?
▫ DBA
▫ Programmeur d’application de BD
• Existe dans d autres SGBDR
▫ MySQL : PL/SQL like
▫ Sybase et Microsoft SQL server : Transact-SQL
▫ PostgreSQL : PL/pgSQL
▫ DB2 (IBM) : SQL Procedural Language
• Documentation Oracle (en anglais)
http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/toc.htm
• Documentation MySQL
http://dev.mysql.com/doc/refman/5.0/fr/stored-procedure-syntax.html
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 6
Quel est l intérêt de PL/SQL ?
• SQL est déclaratif
▫ Requêtes naturelles
▫ Mais les applications complexes exigent plus,
– Pour la facilité et l’efficacité de développement :
– gérer le contexte,
– lier plusieurs requêtes entre elles,
– créer des librairies de procédures cataloguées réutilisables
– Pour l’efficacité de l’application :
– factoriser les traitements proches des données
– réduire les échanges client et serveur
(un programme PL/SQL est exécuté sur le serveur)
⇒ Besoin d étendre SQL :
PL/SQL est une extension procédurale
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 7
PL/SQL - Modes
• Interactif :
▫ Exécution de code
– par exemple, contrôler ou corriger des données
• Stocké :
▫ Procédures, fonctions ou de triggers
▫ Appel interne
• Programme :
▫ Appel depuis langages généralistes (JDBC)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 8
Architecture
Connexion
+
Plusieurs
requêtes
SQL
Analyse SQL
+
Compilation
requête
BD
Connexion
+
Appel de
procédure
PL/SQL
BD
Accès Accès
Appel
Requête
Résultats
1
2
3
4
1
2
3
Appels :
(1, 2, 3, 4), (1, 2, 3, 4)
…
Appels :
1, (2, 3), (2, 3), (2, 3)
…
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 9
Structure d un programme
• Programme PL/SQL = bloc (procédure
anonyme, procédure nommée, fonction
nommée) :
DECLARE
-- section de déclarations
-- section optionnelle
…
BEGIN
-- traitement, avec d éventuelles directives SQL
-- section obligatoire
…
EXCEPTION
-- gestion des erreurs retournées par le SGBDR
-- section optionnelle
…
END;
/ ← lance l exécution sous SQL*Plus
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 10
Exemple
DECLARE
-- Quelques variables
v_nbFilms INTEGER;
v_nbArtistes INTEGER;
BEGIN
-- Compte le nombre de films
SELECT COUNT(*) INTO v_nbFilms FROM Film;
-- Compte le nombre d'artistes
SELECT COUNT(*) INTO v_nbArtistes FROM Artiste;
-- Affichage des résultats
DBMS_OUTPUT.PUT_LINE ('Nombre de films: ' || v_nbFilms);
DBMS_OUTPUT.PUT_LINE ('Nombre d''artistes: ' || v_nbArtistes)
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('Problème rencontré dans StatsFilms');
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 11
Imbrication des blocs PL/SQL
• Blocs imbriqués :
• Portée d un identificateur :
▫ un descendant peut accéder aux identificateurs déclarés
par un parent, pas l’inverse
• Un bloc est compilé pour être ensuite exécuté
DECLARE
…
BEGIN
…
EXCEPTION
…
END;
DECLARE
…
BEGIN
…
EXCEPTION
…
END;
DECLARE
…
BEGIN
…
EXCEPTION
…
END;
DECLARE
…
BEGIN
…
EXCEPTION
…
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 12
Identificateurs, commentaires
• Identificateur :
▫ Variable, curseur, exception, etc.
▫ Commence par une lettre
▫ Peut contenir : lettres, chiffres, $, #, _
▫ Interdits : &, -, /, espace
▫ Jusqu’à 30 caractères
▫ Insensible à la casse !
(nompilote = NomPILOTE)
• Commentaires :
-- Commentaire sur une seule ligne
/* Commentaire sur plusieurs
lignes */
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 13
Variables
• Toute variable PL/SQL :
▫ Obligatoirement défini dans DECLARE avant utilisation
• Types de variables PL/SQL :
▫ Types Scalaires (Oracle) :
– NUMBER(5,2),
– VARCHAR2,
– DATE,
– BOOLEAN, …
▫ Composites :
– %TYPE (schéma d’un attribut),
– %ROWTYPE (schéma d’une table ou résultat de requête),
– RECORD (type complexe dérivé),
– TABLE (tables dynamiques)
▫ Référence :
– REF
▫ Large Object :
– LOB (jusqu’à 4 Go ; pointeur si externe)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 14
Variables scalaires
• Syntaxe de déclaration :
Identificateur [CONSTANT] type [[NOT NULL] {:= |
DEFAULT} expression];
▫ CONSTANT :
c’est une constante (doit être initialisée)
▫ NOT NULL :
on ne peut pas lui affecter une valeur nulle (sinon exception
VALUE_ERROR)
▫ Initialisation :
:= (affectation)
DEFAULT
• Pas de déclaration multiple dans PL/SQL !
number1, number2 NUMBER;← déclaration incorrecte !
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 15
Variables scalaires : Exemples
DECLARE
nom varchar2 (10) not null;
adresse varchar2 (20);
x INT := 1;
pi constant FLOAT := 3.14159;
rayon FLOAT DEFAULT 1;
surface DOUBLE := pi * rayon ** 2;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 16
Variables et SQL
• Possibilité d affecter une valeur grâce à une requête SQL
SELECT titre INTO mon_film
FROM FILM
WHERE id_film = mon_id_film ;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 17
Variables composites
• TYPE adresse IS RECORD
(no INTEGER,
rue VARCHAR(40),
ville VARCHAR(40),
codePostal VARCHAR(10) ;
• titre Film.titre%TYPE;
▫ Même type qu’un attribut ou autre variable ;
▫ Préserve des modifications de tables ;
• artiste Artiste%ROWTYPE
▫ Contraintes NOT NULL de la table non transmises ;
▫ un seul tuple affecter à une variable %ROWTYPE !
• Possibilité de dériver des types à partir du retour des requêtes (cf.
curseurs)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 18
Variables composites : Exercice
• Créer une procédure :
▫ Pour un id de Film (mon_id_film) donné
▫ Récupère le titre du film correspondant
▫ Récupère le nom et le prénom du metteur en scène
(id_mes) dans la table Artiste
▫ Affiche le titre et le nom à l aide de
DBMS_OUPUT.PUT_LINE
• Schéma :
▫ Film (id_film, titre, id_mes, année, coût, recette)
▫ Artiste (id, nom, prenom, date_naiss)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 20
Nouveaux types PL/SQL
• Nouveaux types prédéfinis :
BINARY_INTEGER : entiers signés entre –231 et 231
PLS_INTEGER : entiers signés entre –231 et 231
plus performant en opérations arithmétiques
• Sous-types PL/SQL :
▫ Restriction d’un type de base
– CHARACTER, INTEGER, NATURAL, POSITIVE, FLOAT,
SMALLINT, SIGNTYPE, etc.
▫ Restriction : précision ou taille maximale
SUBTYPE nomSousType IS typeBase
[(contrainte)] [NOT NULL];
▫ Exemple de sous-type utilisateur :
SUBTYPE numInsee IS NUMBER(13) NOT NULL;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 21
Conversions implicites
▫ Lors du calcul d’une expression ou d’une affectation
▫ Exception si conversion non autorisée
De A CHAR VARCHAR2
BINARY_
INTEGER
NUMBE
R
LONG DATE RAW ROWID
CHAR OUI OUI OUI OUI OUI OUI OUI
VARCHAR2 OUI OUI OUI OUI OUI OUI OUI
BINARY_
INTEGER
OUI OUI OUI OUI
NUMBER OUI OUI OUI OUI
LONG OUI OUI OUI
DATE OUI OUI OUI
RAW OUI OUI OUI
ROWID OUI OUI
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 22
De A CHAR NUMBER DATE RAW ROWID
CHAR TO_NUMBER TO_DATE HEXTORAW CHARTOROWID
NUMBER TO_CHAR TO_DATE
DATE TO_CHAR
RAW RAWTOHEX
ROWID ROWIDTOHEX
Conversions explicites
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 23
Variables TABLE
• Tableaux dynamiques, composé de :
▫ Clé primaire
▫ Colonne de type scalaire
– %TYPE, %ROWTYPE ou RECORD
• Fonctions PL/SQL dédiées aux tableaux :
EXISTS(x), PRIOR(x), NEXT(x),
DELETE(x,…), COUNT, FIRST, LAST,
DELETE
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 24
Variables TABLE : exemple
DECLARE
TYPE FilmSF IS TABLE OF Film%ROWTYPE
INDEX BY BINARY_INTEGER;
tabFilms FilmSF;
tmpIndex BINARY_INTEGER;
BEGIN
…
tmpIndex := tabFilms.FIRST;
tabFilms(4).Titre := Star Wars - Ep 4 ;
tabFilms(4).MES := 54;
tabFilms.DELETE(5);
…
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 25
Affectation de Variables :
ligne de commande
SQL> ACCEPT s_titre PROMPT Titre Film :
SQL> ACCEPT s_annee PROMPT Année de sortie :
SQL> ACCEPT s_MES PROMPT Metteur en scène :
DECLARE
id_film NUMBER(6,2) DEFAULT 1;
BEGIN
INSERT INTO Film VALUES
(id_film, &s_titre , &s_annee, &s_MES, 0, 0);
END;
/
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 27
Résolution des noms
• Lors de doublons de noms
▫ Variable, Table, Colonne
• Règles de résolution des noms :
▫ Variable du bloc prioritaire sur variable externe au
bloc (et visible)
▫ Variable prioritaire sur nom d’une table
▫ Nom d’une colonne d’une table prioritaire sur
Variable
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 28
Entrées et Sorties
• Paquetage DBMS_OUTPUT :
▫ Sortie d’une valeur :
PUT(valeur IN {VARCHAR2 | DATE | NUMBER});
▫ Sortie d’une valeur suivie de fin de ligne :
PUT_LINE(valeur IN {VARCHAR2 | DATE |
NUMBER});
▫ Entrée d’une valeur :
GET_LINE(ligne OUT VARCHAR2(255), statut OUT
INTEGER);
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 29
Entrées et Sorties (2)
• Autres API pour des E/S spécifiques :
▫ DBMS_PIPE : échanges avec les commandes du système
d’exploitation
▫ UTL_FILE : échanges avec des fichiers
▫ UTL_HTTP : échanges avec un serveur HTTP (Web)
▫ UTL_SMTP : échanges avec un serveur SMTP (courriel)
▫ HTP : affichage des résultats sur une page HTML
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 30
Structures de contrôle
• Structures Conditionnelles
▫ If then else
▫ Case when
• Structures Répétitives
▫ While
▫ Loop
▫ For
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 31
Structures conditionnelles
▫ IF <condition> THEN
<instructions> ;
ELSIF <condition> THEN
<instructions> ;
ELSE
<instructions> ;
END IF;
▫ CASE <variable>
WHEN <value> THEN
<instructions> ;
…
WHEN <value> THEN
<instructions> ;
ELSE
<instructions> ;
END CASE;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 32
IF : exemple
DECLARE
titre Film.titre%TYPE;
BEGIN
IF episode = 4 THEN
DBMS_OUTPUT.PUT_LINE ( A new Hope );
ELSIF episode = 5 THEN
DBMS_OUTPUT.PUT_LINE ( Empire strikes Back );
ELSIF episode = 7 THEN
DBMS_OUTPUT.PUT_LINE ( The Force Awakens );
END IF;
END;
/
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 33
CASE
• Seul le cas valide est traité
• Si aucun cas valide : exception CASE_NOT_FOUND
• Exemple :
DECLARE
titre Film.titre%TYPE;
BEGIN
CASE episode
WHEN 1 THEN DBMS_OUTPUT.PUT_LINE ( The Fantom Menace );
WHEN 2 THEN DBMS_OUTPUT.PUT_LINE ( The Clone Wars );
WHEN 3 THEN DBMS_OUTPUT.PUT_LINE ( Revange of the Siths );
WHEN 4 THEN DBMS_OUTPUT.PUT_LINE ( A new Hope );
WHEN 5 THEN DBMS_OUTPUT.PUT_LINE ( Empire strikes Back );
WHEN 6 THEN DBMS_OUTPUT.PUT_LINE ( Return of the Jedi );
WHEN 7 THEN DBMS_OUTPUT.PUT_LINE ( The Force Awakens );
ELSE
DBMS_OUTPUT.PUT_LINE ( Unkown episode );
END IF;
END;
/
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 34
Structures répétitives
▫ WHILE <condition> LOOP
<instructions> ;
END LOOP;
▫ LOOP
<instructions> ;
EXIT WHEN <condition> ;
<instructions>
END LOOP;
▫ FOR <variable> IN <value> .. <value> LOOP
<instructions> ;
END LOOP;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 35
Tant que (WHILE) : exemple
DECLARE
a INTEGER := 1;
b INTEGER := 1;
BEGIN
WHILE b <= 10 LOOP
a := a * b;
b := b + 1;
END LOOP;
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 36
Répéter (LOOP) : exemple
DECLARE
a INTEGER := 1;
b INTEGER := 1;
BEGIN
LOOP
a := a * b;
b := b + 1;
EXIT WHEN b >= 10;
b := b + 1;
END LOOP;
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 37
Pour (FOR) : exemple
• Compteur est incrémenté de 1 (ou décrémenté
si REVERSE) ;
DECLARE
a INTEGER := 1;
b INTEGER := 1;
BEGIN
FOR b IN 1..10 LOOP
a := a * b;
END LOOP;
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 38
Boucles imbriquées
• Chaque structure répétitives peut avoir une étiquette :
<<étiquette>>
DECLARE
…
BEGIN
…
<<boucleExterne>>
LOOP
…
LOOP
…
EXIT boucleExterne WHEN …;
/* quitter boucle externe */
…
EXIT WHEN …;
-- quitter boucle interne
END LOOP;
…
END LOOP;
…
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 39
Interaction avec la base
• Interrogation directe des données :
▫ SELECT titre INTO varTitre
FROM Film WHERE année = 2015;
– Doit retourner 1 enregistrement
– Sinon TOO_MANY_ROWS ou NO_DATA_FOUND
• Manipulation des données :
▫ INSERT INTO nomTable (liste colonnes) VALUES
(liste expressions);
▫ UPDATE nomTable SET nomColonne = expression
[WHERE condition];
▫ DELETE FROM nomTable [WHERE condition];
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 40
Curseurs
• Problème :
▫ Accès direct : ne prend qu’un seul tuple
▫ Comment récupérer plusieurs tuples ?
Øcurseur parcourt un par un chaque tuple résultat
(‘pointeur’ sur résultats).
– Chaque tuple récupéré pourra être mis dans une
variable
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 41
Curseurs : instructions
DECLARE
-- Définition du curseur sur tous les films
CURSOR lesFilms IS SELECT * FROM Film;
-- Variable d affectation des tuples
leFilm Film%ROWTYPE;
BEGIN
-- Ouverture du curseur et exécution de la requête
OPEN lesFilms;
-- Chargement d un tuple, et positionnement sur le suivant
FETCH lesFilms INTO leFilm;
-- Fermeture du curseur et libération mémoire
CLOSE lesFilms;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 42
Curseurs explicites : attributs
• nomCurseur%ISOPEN
▫ TRUE si le curseur est ouvert
• nomCurseur%FOUND
▫ TRUE si le dernier FETCH contient un tuple
• nomCurseur%NOTFOUND
▫ TRUE si le dernier FETCH ne contient pas de tuples
• nomCurseur%ROWCOUNT
▫ nombre total de lignes traitées jusqu’à présent
(par ex. nombre de FETCH)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 43
Curseur : Exercice
• Programme avec curseur
▫ Récupérer tous les films dont ‘Georges Lucas’ est
le metteur en scène (MES)
▫ Afficher pour chaque film le titre et l’année
▫ Bonus: Afficher le gain total de tous les films
– Somme(recette) - somme(cout)
• Schéma :
▫ Film (id_film, titre, id_mes, année, coût, recette)
▫ Artiste (id, nom, prenom, date_naiss)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 45
Curseur paramétré
• Objectif :
▫ paramétrer la requête associée à un curseur
– Provient d’une variable temporaire, paramètre du programme
• Syntaxe :
CURSOR nomCurseur(param1[, param2, …]) IS …;
Paramètres :
nomPar [IN] type [{:= | DEFAULT} valeur];
(nomPar est inconnu en dehors de la définition !)
• Utilisation :
OPEN nomCurseur(valeurPar1[, valeurPar2, …]);
• Fermeture (CLOSE) avant d utiliser avec d autres
paramètres
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 46
Curseur Paramétré: Exercice
• Programme avec curseur paramétré
▫ Récupérer tous les films d’un MES en paramètre (leMES)
▫ Pour chaque film, affichage :
– Si le gain (recette - cout) est supérieur à une valeur donnée
(seuil)
– Du titre et de l’année
▫ Afficher le nombre de films précédents / total
• Schéma :
▫ Film (id_film, titre, id_mes, année, coût, recette)
▫ Artiste (id, nom, prenom, date_naiss)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 48
Boucle FOR avec curseur
• Exécute les instructions pour chaque enregistrement
DECLARE
CURSOR films(idMES Film.MES%TYPE) IS
SELECT * FROM Film
WHERE MES = idMES ;
leFilm Film%ROWTYPE;
nbSup NUMBER(11,2) := 0;
total NUMBER(11,2) := 0;
BEGIN
-- l ouverture du curseur se fait dans le FOR
FOR leFilm IN films(leMES) LOOP
IF (leFilm.recette - leFilm.cout) > seuil THEN
DBMS_OUTPUT.PUT_LINE(leFilm.titre|| : ||leFilm.année);
nbSup := nbsup + 1;
END IF;
total = films%ROWCOUNT;
END LOOP;
-- Fermeture du curseur (plus de %ROWCOUNT)
DBMS_OUTPUT.PUT_LINE( Résultat: || nbSup || / || total);
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 49
Programmes et Sous-Programmes
• Nommage et paramétrage de Blocs
▫ Procédure
– Eventuellement retourne DES résultats
▫ Fonction
– Résultat unique obligatoire
– Appel possible dans une requête SQL
• Programmes stockés dans la base
▫ Modularité (conception et maintenance),
▫ Réutilisation
▫ Intégrité (regroupement de traitements dépendants)
▫ Sécurité (gestion des droits/contraintes sur données)
• Récursivité autorisée (à utiliser avec précaution) !
• Sous-Programmes
▫ Défini dans le DECLARE
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 50
Appel de programme
• Appel de procédure/fonction depuis un bloc PL/SQL :
nomProcedure(listeParEffectifs);
• Appel de procédure stockée sous SQL*Plus :
SQL> EXECUTE nomProcedure(listeParEffectifs);
• Appel de fonction stockée sous SQL*Plus :
SQL> nomFonction(listeParEffectifs);
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 51
Procédures
• Syntaxe :
CREATE [OR REPLACE] PROCEDURE nomProcedure
[(par1 [IN | OUT | IN OUT] [NOCOPY] type1
[{:= | DEFAULT} expression]
[, par2 [IN | OUT | IN OUT] [NOCOPY] type2
[{:= | DEFAULT} expression … )]
{IS | AS} [declarations;]
BEGIN
<instructions>;
[EXCEPTION
<traitementExceptions>;
]
END [nomProcedure];
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 52
Paramètres
• Types de paramètres :
▫ Entrée (IN)
– Valeur constante (pas d’affectation)
– Toujours passé par référence !
▫ Sortie (OUT)
– Valeur de retour
– Ne peut être qu’affecté (pas utilisé)
– Par défaut (sans NOCOPY) passé par valeur !
▫ Entrée et sortie (IN OUT)
– Passé en référence
– Valeur de retour
– Peut être utilisé et affecté
– Par défaut (sans NOCOPY) passé par valeur !
• NOCOPY
▫ Données retours par référence (paramètres volumineux)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 53
Procédure locale : exemple
DECLARE
-- Procédure locale
PROCEDURE lesFilms (prenomParam VARCHAR2(30), nomParam VARCHAR2(30))
IS
CURSOR films(lePrenom VARCHAR2(20), leNom VARCHAR2(20)) IS
SELECT * FROM Film
WHERE MES = (SELECT id
FROM Artiste
WHERE Nom=leNom and Prenom=lePrenom);
leFilm Film%ROWTYPE;
BEGIN
FOR leFilm IN films(prenomParam,nomParam) LOOP
DBMS_OUTPUT.PUT_LINE( ||leFilm.titre|| : ||leFilm.année);
END LOOP;
END lesFilms;
CURSOR mes IS
SELECT * FROM Artiste where id in (select MES from Films);
leMes Film%ROWTYPE;
BEGIN
FOR leMes IN mes() LOOP
DBMS_OUTPUT.PUT_LINE(leMes.prenom|| ||leMes.nom|| : );
-- Appel de la procédure
lesFilms(leMes.prenom,lesMes.nom);
END LOOP;
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 54
Fonctions
• Syntaxe :
CREATE [OR REPLACE] FUNCTION nomFonction
[(par1 [IN | OUT | IN OUT] [NOCOPY] type1
[{:= | DEFAULT} expression]
[, par2 [IN | OUT | IN OUT] [NOCOPY] type2
[{:= | DEFAULT} expression … )]
-- OUT a éviter (effets de bords)
RETURN typeRetour
{IS | AS} [declarations;]
BEGIN
<instructions>;
…
RETURN varRetour;
-- return obligatoire
[EXCEPTION
<traitementExceptions>;
]
END[nomFonction];
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 55
Fonctions : Exemple
DECLARE
FUNCTION nbFilms (idMES Film.MES%TYPE)
RETURN INTEGER
IS
nbFilm INTEGER;
BEGIN
SELECT COUNT(*) INTO nbFilm FROM Film
WHERE MES = idMES;
RETURN nbFilm;
END nbFilms;
CURSOR mes IS
SELECT * FROM Artiste where id in (select MES from Film);
leMes Film%ROWTYPE;
nbFilm INTEGER;
BEGIN
FOR leMes IN mes() LOOP
nbFilm := nbFilms(leMes.id);
DBMS_OUTPUT.PUT_LINE(leMes.prenom|| ||leMes.nom|| : ||nbFilm);
END LOOP;
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 56
Fonction stockée : exemple
• Appel depuis SQL*Plus :
SQL> SELECT prenom, nom, nbFilms(id)
FROM Artiste
WHERE id in (select MES from Film);
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 57
Manipulation de programme
• Création ou modification de sous-programme :
CREATE [OR REPLACE] {PROCEDURE | FUNCTION} nom …
• Recompilation automatique lors d une modification
▫ Pour une compilation manuelle :
ALTER {PROCEDURE | FUNCTION} nom COMPILE
▫ Affichage des erreurs de compilation sous SQL*Plus :
SHOW ERRORS
• Suppression de sous-programme :
DROP {PROCEDURE | FUNCTION} nom
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 58
Paquetages
• Paquetage
▫ Regroupement variables, curseurs, fonctions, procédures,
etc.
▫ Ensemble cohérent de services
• Encapsulation
▫ Accès extérieurs
▫ Accès privés (internes au paquetage)
• Structure
▫ Section de spécification
– Déclaration des variables et curseurs,
– Déclaration sous-programmes accessibles depuis l’extérieur
▫ Section d’implémentation
– Code des sous-programmes accessibles depuis l’extérieur
– Sous-programmes accessibles en interne (privés)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 59
Section de spécification
• Syntaxe :
CREATE [OR REPLACE] PACKAGE nomPaquetage {IS | AS}
[declarationTypeRECORDpublique …; ]
[declarationTypeTABLEpublique …; ]
[declarationSUBTYPEpublique …; ]
[declarationRECORDpublique …; ]
[declarationTABLEpublique …; ]
[declarationEXCEPTIONpublique …; ]
[declarationCURSORpublique …; ]
[declarationVariablePublique …; ]
[declarationFonctionPublique …; ]
[declarationProcedurePublique …; ]
END [nomPaquetage];
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 60
Spécification : exemple
CREATE PACKAGE gestionMES AS
…
FUNCTION nbFilms(idMES Film.MES%TYPE)
RETURN INTEGER;
FUNCTION leMES(titreFilm Film.MES%TYPE)
RETURN INTEGER;
PROCEDURE filmParMES();
…
END gestionMES;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 61
Section d implémentation
• Syntaxe :
CREATE [OR REPLACE] PACKAGE BODY nomPaquetage {IS | AS}
[declarationTypePrive …; ]
[declarationObjetPrive …; ]
[definitionFonctionPrivee …; ]
[definitionProcedurePrivee …; ]
[instructionsFonctionPublique …; ]
[instructionsProcedurePublique …; ]
END [nomPaquetage];
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 62
Implémentation : exemple (1/2)
CREATE PACKAGE BODY gestionMES AS
-- Fonction publique : Nombre de films pour un Metteur en scène
FUNCTION nbFilms(idMES Film.MES%TYPE) RETURN INTEGER IS
nbFilm INTEGER;
BEGIN
SELECT COUNT(*) INTO nbFilm FROM Film WHERE MES = idMES;
RETURN nbFilm;
END nbFilms;
-- Fonction publique : Retourne l id du metteur en scène à partir d une titre de film
FUNCTION leMES(titreFilm Film.MES%TYPE) RETURN INTEGER IS
idMES Film.MES%TYPE;
BEGIN
SELECT MES INTO idMES FROM Film WHERE title like titreFilm;
RETURN idMES;
END leMES;
/* Fonction publique : Affiche pour chaque metteur en scène provenant un curseur privé :
- son prenom et son nom
- appel une procédure d affichage de tous ses films */
PROCEDURE filmParMES() IS
leMES Artiste%ROWTYPE;
BEGIN
FOR leMES IN lesMES() LOOP
DBMS_OUTPUT.PUT_LINE(leMES.prenom|| ||leMES.nom);
lesFilms (leMES.id);
END LOOP;
END filmParMES;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 63
Implémentation : exemple (2/2)
-- Curseur privé : liste tous les artistes metteurs en scène
CURSOR lesMES()
IS SELECT * FROM Artiste where id in (select MES from Films);
-- Procédure privée : affiche tous les films d un metteur en scène
PROCEDURE lesFilms (leMES Film.MES%TYPE) IS
CURSOR films (idMES Film.MES%TYPE) IS
SELECT * FROM Film where MES = idMES
ORDER BY année;
leFilm FILM%ROWTYPE;
BEGIN
FOR leFilm IN films(leMES) LOOP
DBMS_OUTPUT.PUT_LINE( ||leFilm.titre|| ||leFilm.année);
END LOOP;
END lesFilms;
END gestionMES;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 64
Référence au paquetage
• Uniquement sur les objets et programmes publics
• Syntaxe :
nomPaquetage.nomObjet
nomPaquetage.nomSousProgramme(…)
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 65
Manipulation d un paquetage
• Re-compilation d un paquetage :
▫ CREATE OR REPLACE PACKAGE
▫ Modification d’une sections
Øre-compilation automatique de l’autre section
▫ Erreurs de compilation avec SQL*Plus :
SHOW ERRORS
• Suppression d un paquetage :
DROP BODY nomPaquetage;
DROP nomPaquetage;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 66
Exceptions
• Conditions d erreur lors de l exécution
• EXCEPTION
▫ Clause de récupération d’erreur
▫ Evite l’arrêt systèmatique du programme
• Possibilité de définir des erreurs
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 67
Traitement des exceptions
• Syntaxe :
BEGIN
…
EXCEPTION
WHEN nomException1 [OR nomException2 …] THEN
instructions1;
WHEN nomException3 [OR nomException4 …] THEN
instructions3;
WHEN OTHERS THEN
instructionsAttrapeTout;
END;
• Affichage de l erreur
DBMS_OUTPUT.PUT_LINE(SQLERRM || : || SQLCODE);
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 68
Lors d une exception
1. Aucun traitement n est prévu
Ø le programme s’arrête
2. Un traitement est prévu :
▫ Arrêt de l’exécution du bloc PL/SQL courant
▫ L’exception est recherchée dans la section EXCEPTION
– Associée au bloc courant,
– Sinon dans les blocs parents
– Sinon le programme appelant
▫ Exception traitée suivant les instructions trouvées
– Spécifiques
– Attrape-tout
▫ Exécution du traitement prévu par l’exception (THEN…)
▫ Suite de l’exécution dans le bloc/programme parent
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 69
Suivi des exceptions
DECLARE …
BEGIN
…
…
…
…
…
…
…
…
EXCEPTION
…
END;
DECLARE …
BEGIN
…
…
…
…
EXCEPTION
…
END;
DECLARE …
BEGIN
…
…
EXCEPTION
…
END;
?
?
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 70
Mécanismes de déclenchement
1. Déclenchement automatique
• Erreurs prédéfinies Oracle
• VALUE_ERROR, ZERO_DIVIDE, TOO_MANY_ROWS, etc.
2. Déclenchement programmé
• Dans DECLARE :
nomException EXCEPTION;
• Dans BEGIN :
RAISE nomException;
• Dans EXCEPTION :
WHEN nomException THEN
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 71
Mécanismes de déclenchement (2)
• Déclenchement
▫ avec message et code d’erreur personnalisé :
RAISE_APPLICATION_ERROR(
numErr, messageErr,[TRUE | FALSE]);
▫ TRUE : mise dans une pile d’erreurs à propager
(par défaut) ;
FALSE : remplace les erreurs précédentes dans la
pile
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 72
Transactions
• Objectif :
▫ Cohérence d’une suite de maj sur des données
État cohérent 2
de la base
Commit
Instruction 1
Instruction 2
…
Instruction n
Rollback
État cohérent 1
de la base
Perturbation
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 73
Transactions : contrôle
• Début
▫ 1° SQL après le BEGIN
▫ 1° SQL après une transaction
• Fin
▫ Avec succès : COMMIT [WORK];
▫ Échec : ROLLBACK [WORK];
▫ Fin implicite
– Avec succès : fin normale d’une session
– Échec : fin anormale d’une session
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 74
Transactions : contrôle (2)
• Annulations partielles
SAVEPOINT nomPoint; -- insertion point de validation
ROLLBACK TO nomPoint; -- retour à l état au nomPoint
• Remarques :
▫ Sortie suite à une exception non traitée
– Pas de ROLLBACK implicite
– Opérations réalisées dans le sous-programme non annulées
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données 75
Transactions/Exceptions : exemple
CREATE PROCEDURE ajoutFilm () IS
nvFilm Film%ROWTYPE;
nbFilm INTEGER;
mesErreur EXCEPTION;
filmErreur EXCEPTION;
BEGIN
SELECT MAX(id)+1 INTO film.id FROM Film;
nvFilm.titre := DBMS_OUTPUT.GET_LINE( Titre= ,1);
nvFilm.MES := trouver_idMES();
IF nvFilm.MES IS NULL OR nvFilm.MES = 0 THEN RAISE mesErreur; END IF;
nvFilm.annee := DBMS_OUTPUT.GET_LINE( Année= ,1);
nvFilm.cout := DBMS_OUTPUT.GET_LINE( Cout= ,1);
nvFilm.recette := DBMS_OUTPUT.GET_LINE( Recette= ,1);
INSERT INTO Film values
(nvFilm.id, nvFilm.titre, nvFilm.MES, nvFilm.cout, nvFilm.recette);
SELECT COUNT(*) INTO nbFilm
FROM Film where titre = nvFilm.titre AND annee = nvFilm.annee;
IF nbFilm > 1 THEN RAISE filmErreur; END IF;
COMMIT;
EXCEPTION
WHEN mesErreur THEN
DBMS_OUTPUT.PUT_LINE( Metteur en scène inconnu );
WHEN filmErreur THEN
DBMS_OUTPUT.PUT_LINE( Film déjà existant );
ROLLBACK;
WHEN OTHERS THEN
ROLLBACK;
END;
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données
PL/SQL et MySQL
• Quelques différences :
▫ Déclaration d’une variable : DECLARE var <type>;
▫ Affectation de variable : SET variable = <expr>;
▫ Curseurs :
– DECLARE cur CURSOR FOR <SQL>;
– FETCH cur INTO a, b, c; (plusieurs variables)
▫ Pas de boucles FOR
▫ Afficher des données : SELECT
– SELECT concat(‘texte : ’, var, ‘. Texte’) ;
▫ Exceptions
– Déclarer un “maître” (Handler) pour l’erreur
– Valable pour la procédure à partir de la déclaration
– Différents types d’actions
76
Procédures stockées : PL/SQL
N. Travers
Introduction aux Bases de Données
Mysql et Erreurs
DECLARE <type d’action> HANDLER
FOR <condition d’erreur> [, <condition>] ...
<statement>
• Type d’action :
▫ CONTINUE / EXIT / UNDO
• Condition d’erreur :
▫ Erreur MySQL : SQLSTATE [VALUE] <sqlstate value>
– http://dev.mysql.com/doc/refman/5.0/fr/error-handling.html
– Ex : 23000 : valeur unique, 42000 : incorrect/inconnu/interdit
▫ SQLWARNING / NOT FOUND / SQLEXCEPTION
77

Contenu connexe

Similaire à FIP_pl-sql.pdf

Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfrachidimstapha
 
Introduction aux bases de données NoSQL
Introduction aux bases de données NoSQLIntroduction aux bases de données NoSQL
Introduction aux bases de données NoSQLAntoine Augusti
 
Plsql triggers
Plsql triggersPlsql triggers
Plsql triggersAz Za
 
BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...
BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...
BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...Cédrick Lunven
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCDamien Seguy
 
Base de données graphe, Noe4j concepts et mise en oeuvre
Base de données graphe, Noe4j concepts et mise en oeuvreBase de données graphe, Noe4j concepts et mise en oeuvre
Base de données graphe, Noe4j concepts et mise en oeuvreMICHRAFY MUSTAFA
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
BigData_Chp4: NOSQL
BigData_Chp4: NOSQLBigData_Chp4: NOSQL
BigData_Chp4: NOSQLLilia Sfaxi
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usagesPostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usagesOpen Source Experience
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLHervé Leclerc
 

Similaire à FIP_pl-sql.pdf (20)

Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdf
 
Les02.ppt
Les02.pptLes02.ppt
Les02.ppt
 
Rails 3 au Djangocong
Rails 3 au DjangocongRails 3 au Djangocong
Rails 3 au Djangocong
 
Riak introduction
Riak introductionRiak introduction
Riak introduction
 
Introduction aux bases de données NoSQL
Introduction aux bases de données NoSQLIntroduction aux bases de données NoSQL
Introduction aux bases de données NoSQL
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Plsql triggers
Plsql triggersPlsql triggers
Plsql triggers
 
BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...
BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...
BigData Paris 2022 - Innovations récentes et futures autour du NoSQL Apache ...
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
Base de données graphe, Noe4j concepts et mise en oeuvre
Base de données graphe, Noe4j concepts et mise en oeuvreBase de données graphe, Noe4j concepts et mise en oeuvre
Base de données graphe, Noe4j concepts et mise en oeuvre
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
Interfaces controlesbasededonné
Interfaces controlesbasededonnéInterfaces controlesbasededonné
Interfaces controlesbasededonné
 
SQL.pdf
SQL.pdfSQL.pdf
SQL.pdf
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
BigData_Chp4: NOSQL
BigData_Chp4: NOSQLBigData_Chp4: NOSQL
BigData_Chp4: NOSQL
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usagesPostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
 
MariaDB une base de donnees NewSQL
MariaDB une base de donnees NewSQLMariaDB une base de donnees NewSQL
MariaDB une base de donnees NewSQL
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
spring.pdf
spring.pdfspring.pdf
spring.pdf
 

Dernier

WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfSophie569778
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...Institut de l'Elevage - Idele
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageInstitut de l'Elevage - Idele
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfInstitut de l'Elevage - Idele
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...Institut de l'Elevage - Idele
 
firefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirstjob4
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...Institut de l'Elevage - Idele
 
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...Institut de l'Elevage - Idele
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéInstitut de l'Elevage - Idele
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfInstitut de l'Elevage - Idele
 
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...Institut de l'Elevage - Idele
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfInstitut de l'Elevage - Idele
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestionyakinekaidouchi1
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusInstitut de l'Elevage - Idele
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de planchermansouriahlam
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...Institut de l'Elevage - Idele
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesInstitut de l'Elevage - Idele
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Ville de Châteauguay
 

Dernier (20)

WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdfWBS OBS RACI_2020-etunhjjlllllll pdf.pdf
WBS OBS RACI_2020-etunhjjlllllll pdf.pdf
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
 
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
 
firefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdf
 
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
GAL2024 - Parcellaire des fermes laitières : en enjeu de compétitivité et de ...
 
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
GAL2024 - Méthane 2030 : une démarche collective française à destination de t...
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversité
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdf
 
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
GAL2024 - Consommations et productions d'énergies dans les exploitations lait...
 
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdfJTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdf
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestion
 
JTC 2024 Bâtiment et Photovoltaïque.pdf
JTC 2024  Bâtiment et Photovoltaïque.pdfJTC 2024  Bâtiment et Photovoltaïque.pdf
JTC 2024 Bâtiment et Photovoltaïque.pdf
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de plancher
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentes
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
 

FIP_pl-sql.pdf

  • 1. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 1 Nicolas Travers Équipe Vertigo - Laboratoire CEDRIC Conservatoire National des Arts & Métiers, Paris, France Procédures Stockées Bases de Données Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 2 Contenu du cours • PL/SQL ▫ Variables ▫ Structures de contrôle ▫ Interaction avec la base et Curseurs ▫ Sous-programmes, paquetages ▫ Exceptions ▫ Transactions (D après les supports de Michel Crucianu, Cédric du Mouza et Philippe Rigaux)
  • 2. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 3 Bibliographie Bales, D.K. Java programming with Oracle JDBC. O Reilly, 2002. Bizoi, R. PL/SQL pour Oracle 10g, Eyrolles. 2006. Date, C. Introduction aux bases de données. Vuibert, 2004 (8ème édition). Gardarin, G. Bases de données, Eyrolles. 2003. Reese, G. JDBC et Java : guide du programmeur. O Reilly, 2001. Soutou, C. SQL pour Oracle. Eyrolles, 2008 (3ème édition). Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 4 PL/SQL • Procedural Language / Structured Query Language ▫ PL/SQL : langage propriétaire Oracle ▫ Language procédural : – Variables, boucles, tests, curseurs, fonctions/procédures, exceptions • Syntaxe de PL/SQL inspirée du langage Ada (Pascal) ▫ Avantages de SQL ▫ Programmation en plus • PL/SQL n est pas très éloigné du langage normalisé Persistent Stored Modules (PSM)
  • 3. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 5 PL/SQL • Qui ? ▫ DBA ▫ Programmeur d’application de BD • Existe dans d autres SGBDR ▫ MySQL : PL/SQL like ▫ Sybase et Microsoft SQL server : Transact-SQL ▫ PostgreSQL : PL/pgSQL ▫ DB2 (IBM) : SQL Procedural Language • Documentation Oracle (en anglais) http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/toc.htm • Documentation MySQL http://dev.mysql.com/doc/refman/5.0/fr/stored-procedure-syntax.html Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 6 Quel est l intérêt de PL/SQL ? • SQL est déclaratif ▫ Requêtes naturelles ▫ Mais les applications complexes exigent plus, – Pour la facilité et l’efficacité de développement : – gérer le contexte, – lier plusieurs requêtes entre elles, – créer des librairies de procédures cataloguées réutilisables – Pour l’efficacité de l’application : – factoriser les traitements proches des données – réduire les échanges client et serveur (un programme PL/SQL est exécuté sur le serveur) ⇒ Besoin d étendre SQL : PL/SQL est une extension procédurale
  • 4. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 7 PL/SQL - Modes • Interactif : ▫ Exécution de code – par exemple, contrôler ou corriger des données • Stocké : ▫ Procédures, fonctions ou de triggers ▫ Appel interne • Programme : ▫ Appel depuis langages généralistes (JDBC) Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 8 Architecture Connexion + Plusieurs requêtes SQL Analyse SQL + Compilation requête BD Connexion + Appel de procédure PL/SQL BD Accès Accès Appel Requête Résultats 1 2 3 4 1 2 3 Appels : (1, 2, 3, 4), (1, 2, 3, 4) … Appels : 1, (2, 3), (2, 3), (2, 3) …
  • 5. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 9 Structure d un programme • Programme PL/SQL = bloc (procédure anonyme, procédure nommée, fonction nommée) : DECLARE -- section de déclarations -- section optionnelle … BEGIN -- traitement, avec d éventuelles directives SQL -- section obligatoire … EXCEPTION -- gestion des erreurs retournées par le SGBDR -- section optionnelle … END; / ← lance l exécution sous SQL*Plus Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 10 Exemple DECLARE -- Quelques variables v_nbFilms INTEGER; v_nbArtistes INTEGER; BEGIN -- Compte le nombre de films SELECT COUNT(*) INTO v_nbFilms FROM Film; -- Compte le nombre d'artistes SELECT COUNT(*) INTO v_nbArtistes FROM Artiste; -- Affichage des résultats DBMS_OUTPUT.PUT_LINE ('Nombre de films: ' || v_nbFilms); DBMS_OUTPUT.PUT_LINE ('Nombre d''artistes: ' || v_nbArtistes) EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Problème rencontré dans StatsFilms'); END;
  • 6. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 11 Imbrication des blocs PL/SQL • Blocs imbriqués : • Portée d un identificateur : ▫ un descendant peut accéder aux identificateurs déclarés par un parent, pas l’inverse • Un bloc est compilé pour être ensuite exécuté DECLARE … BEGIN … EXCEPTION … END; DECLARE … BEGIN … EXCEPTION … END; DECLARE … BEGIN … EXCEPTION … END; DECLARE … BEGIN … EXCEPTION … END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 12 Identificateurs, commentaires • Identificateur : ▫ Variable, curseur, exception, etc. ▫ Commence par une lettre ▫ Peut contenir : lettres, chiffres, $, #, _ ▫ Interdits : &, -, /, espace ▫ Jusqu’à 30 caractères ▫ Insensible à la casse ! (nompilote = NomPILOTE) • Commentaires : -- Commentaire sur une seule ligne /* Commentaire sur plusieurs lignes */
  • 7. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 13 Variables • Toute variable PL/SQL : ▫ Obligatoirement défini dans DECLARE avant utilisation • Types de variables PL/SQL : ▫ Types Scalaires (Oracle) : – NUMBER(5,2), – VARCHAR2, – DATE, – BOOLEAN, … ▫ Composites : – %TYPE (schéma d’un attribut), – %ROWTYPE (schéma d’une table ou résultat de requête), – RECORD (type complexe dérivé), – TABLE (tables dynamiques) ▫ Référence : – REF ▫ Large Object : – LOB (jusqu’à 4 Go ; pointeur si externe) Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 14 Variables scalaires • Syntaxe de déclaration : Identificateur [CONSTANT] type [[NOT NULL] {:= | DEFAULT} expression]; ▫ CONSTANT : c’est une constante (doit être initialisée) ▫ NOT NULL : on ne peut pas lui affecter une valeur nulle (sinon exception VALUE_ERROR) ▫ Initialisation : := (affectation) DEFAULT • Pas de déclaration multiple dans PL/SQL ! number1, number2 NUMBER;← déclaration incorrecte !
  • 8. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 15 Variables scalaires : Exemples DECLARE nom varchar2 (10) not null; adresse varchar2 (20); x INT := 1; pi constant FLOAT := 3.14159; rayon FLOAT DEFAULT 1; surface DOUBLE := pi * rayon ** 2; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 16 Variables et SQL • Possibilité d affecter une valeur grâce à une requête SQL SELECT titre INTO mon_film FROM FILM WHERE id_film = mon_id_film ;
  • 9. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 17 Variables composites • TYPE adresse IS RECORD (no INTEGER, rue VARCHAR(40), ville VARCHAR(40), codePostal VARCHAR(10) ; • titre Film.titre%TYPE; ▫ Même type qu’un attribut ou autre variable ; ▫ Préserve des modifications de tables ; • artiste Artiste%ROWTYPE ▫ Contraintes NOT NULL de la table non transmises ; ▫ un seul tuple affecter à une variable %ROWTYPE ! • Possibilité de dériver des types à partir du retour des requêtes (cf. curseurs) Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 18 Variables composites : Exercice • Créer une procédure : ▫ Pour un id de Film (mon_id_film) donné ▫ Récupère le titre du film correspondant ▫ Récupère le nom et le prénom du metteur en scène (id_mes) dans la table Artiste ▫ Affiche le titre et le nom à l aide de DBMS_OUPUT.PUT_LINE • Schéma : ▫ Film (id_film, titre, id_mes, année, coût, recette) ▫ Artiste (id, nom, prenom, date_naiss)
  • 10. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 20 Nouveaux types PL/SQL • Nouveaux types prédéfinis : BINARY_INTEGER : entiers signés entre –231 et 231 PLS_INTEGER : entiers signés entre –231 et 231 plus performant en opérations arithmétiques • Sous-types PL/SQL : ▫ Restriction d’un type de base – CHARACTER, INTEGER, NATURAL, POSITIVE, FLOAT, SMALLINT, SIGNTYPE, etc. ▫ Restriction : précision ou taille maximale SUBTYPE nomSousType IS typeBase [(contrainte)] [NOT NULL]; ▫ Exemple de sous-type utilisateur : SUBTYPE numInsee IS NUMBER(13) NOT NULL; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 21 Conversions implicites ▫ Lors du calcul d’une expression ou d’une affectation ▫ Exception si conversion non autorisée De A CHAR VARCHAR2 BINARY_ INTEGER NUMBE R LONG DATE RAW ROWID CHAR OUI OUI OUI OUI OUI OUI OUI VARCHAR2 OUI OUI OUI OUI OUI OUI OUI BINARY_ INTEGER OUI OUI OUI OUI NUMBER OUI OUI OUI OUI LONG OUI OUI OUI DATE OUI OUI OUI RAW OUI OUI OUI ROWID OUI OUI
  • 11. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 22 De A CHAR NUMBER DATE RAW ROWID CHAR TO_NUMBER TO_DATE HEXTORAW CHARTOROWID NUMBER TO_CHAR TO_DATE DATE TO_CHAR RAW RAWTOHEX ROWID ROWIDTOHEX Conversions explicites Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 23 Variables TABLE • Tableaux dynamiques, composé de : ▫ Clé primaire ▫ Colonne de type scalaire – %TYPE, %ROWTYPE ou RECORD • Fonctions PL/SQL dédiées aux tableaux : EXISTS(x), PRIOR(x), NEXT(x), DELETE(x,…), COUNT, FIRST, LAST, DELETE
  • 12. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 24 Variables TABLE : exemple DECLARE TYPE FilmSF IS TABLE OF Film%ROWTYPE INDEX BY BINARY_INTEGER; tabFilms FilmSF; tmpIndex BINARY_INTEGER; BEGIN … tmpIndex := tabFilms.FIRST; tabFilms(4).Titre := Star Wars - Ep 4 ; tabFilms(4).MES := 54; tabFilms.DELETE(5); … END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 25 Affectation de Variables : ligne de commande SQL> ACCEPT s_titre PROMPT Titre Film : SQL> ACCEPT s_annee PROMPT Année de sortie : SQL> ACCEPT s_MES PROMPT Metteur en scène : DECLARE id_film NUMBER(6,2) DEFAULT 1; BEGIN INSERT INTO Film VALUES (id_film, &s_titre , &s_annee, &s_MES, 0, 0); END; /
  • 13. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 27 Résolution des noms • Lors de doublons de noms ▫ Variable, Table, Colonne • Règles de résolution des noms : ▫ Variable du bloc prioritaire sur variable externe au bloc (et visible) ▫ Variable prioritaire sur nom d’une table ▫ Nom d’une colonne d’une table prioritaire sur Variable Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 28 Entrées et Sorties • Paquetage DBMS_OUTPUT : ▫ Sortie d’une valeur : PUT(valeur IN {VARCHAR2 | DATE | NUMBER}); ▫ Sortie d’une valeur suivie de fin de ligne : PUT_LINE(valeur IN {VARCHAR2 | DATE | NUMBER}); ▫ Entrée d’une valeur : GET_LINE(ligne OUT VARCHAR2(255), statut OUT INTEGER);
  • 14. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 29 Entrées et Sorties (2) • Autres API pour des E/S spécifiques : ▫ DBMS_PIPE : échanges avec les commandes du système d’exploitation ▫ UTL_FILE : échanges avec des fichiers ▫ UTL_HTTP : échanges avec un serveur HTTP (Web) ▫ UTL_SMTP : échanges avec un serveur SMTP (courriel) ▫ HTP : affichage des résultats sur une page HTML Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 30 Structures de contrôle • Structures Conditionnelles ▫ If then else ▫ Case when • Structures Répétitives ▫ While ▫ Loop ▫ For
  • 15. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 31 Structures conditionnelles ▫ IF <condition> THEN <instructions> ; ELSIF <condition> THEN <instructions> ; ELSE <instructions> ; END IF; ▫ CASE <variable> WHEN <value> THEN <instructions> ; … WHEN <value> THEN <instructions> ; ELSE <instructions> ; END CASE; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 32 IF : exemple DECLARE titre Film.titre%TYPE; BEGIN IF episode = 4 THEN DBMS_OUTPUT.PUT_LINE ( A new Hope ); ELSIF episode = 5 THEN DBMS_OUTPUT.PUT_LINE ( Empire strikes Back ); ELSIF episode = 7 THEN DBMS_OUTPUT.PUT_LINE ( The Force Awakens ); END IF; END; /
  • 16. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 33 CASE • Seul le cas valide est traité • Si aucun cas valide : exception CASE_NOT_FOUND • Exemple : DECLARE titre Film.titre%TYPE; BEGIN CASE episode WHEN 1 THEN DBMS_OUTPUT.PUT_LINE ( The Fantom Menace ); WHEN 2 THEN DBMS_OUTPUT.PUT_LINE ( The Clone Wars ); WHEN 3 THEN DBMS_OUTPUT.PUT_LINE ( Revange of the Siths ); WHEN 4 THEN DBMS_OUTPUT.PUT_LINE ( A new Hope ); WHEN 5 THEN DBMS_OUTPUT.PUT_LINE ( Empire strikes Back ); WHEN 6 THEN DBMS_OUTPUT.PUT_LINE ( Return of the Jedi ); WHEN 7 THEN DBMS_OUTPUT.PUT_LINE ( The Force Awakens ); ELSE DBMS_OUTPUT.PUT_LINE ( Unkown episode ); END IF; END; / Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 34 Structures répétitives ▫ WHILE <condition> LOOP <instructions> ; END LOOP; ▫ LOOP <instructions> ; EXIT WHEN <condition> ; <instructions> END LOOP; ▫ FOR <variable> IN <value> .. <value> LOOP <instructions> ; END LOOP;
  • 17. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 35 Tant que (WHILE) : exemple DECLARE a INTEGER := 1; b INTEGER := 1; BEGIN WHILE b <= 10 LOOP a := a * b; b := b + 1; END LOOP; END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 36 Répéter (LOOP) : exemple DECLARE a INTEGER := 1; b INTEGER := 1; BEGIN LOOP a := a * b; b := b + 1; EXIT WHEN b >= 10; b := b + 1; END LOOP; END;
  • 18. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 37 Pour (FOR) : exemple • Compteur est incrémenté de 1 (ou décrémenté si REVERSE) ; DECLARE a INTEGER := 1; b INTEGER := 1; BEGIN FOR b IN 1..10 LOOP a := a * b; END LOOP; END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 38 Boucles imbriquées • Chaque structure répétitives peut avoir une étiquette : <<étiquette>> DECLARE … BEGIN … <<boucleExterne>> LOOP … LOOP … EXIT boucleExterne WHEN …; /* quitter boucle externe */ … EXIT WHEN …; -- quitter boucle interne END LOOP; … END LOOP; … END;
  • 19. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 39 Interaction avec la base • Interrogation directe des données : ▫ SELECT titre INTO varTitre FROM Film WHERE année = 2015; – Doit retourner 1 enregistrement – Sinon TOO_MANY_ROWS ou NO_DATA_FOUND • Manipulation des données : ▫ INSERT INTO nomTable (liste colonnes) VALUES (liste expressions); ▫ UPDATE nomTable SET nomColonne = expression [WHERE condition]; ▫ DELETE FROM nomTable [WHERE condition]; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 40 Curseurs • Problème : ▫ Accès direct : ne prend qu’un seul tuple ▫ Comment récupérer plusieurs tuples ? Øcurseur parcourt un par un chaque tuple résultat (‘pointeur’ sur résultats). – Chaque tuple récupéré pourra être mis dans une variable
  • 20. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 41 Curseurs : instructions DECLARE -- Définition du curseur sur tous les films CURSOR lesFilms IS SELECT * FROM Film; -- Variable d affectation des tuples leFilm Film%ROWTYPE; BEGIN -- Ouverture du curseur et exécution de la requête OPEN lesFilms; -- Chargement d un tuple, et positionnement sur le suivant FETCH lesFilms INTO leFilm; -- Fermeture du curseur et libération mémoire CLOSE lesFilms; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 42 Curseurs explicites : attributs • nomCurseur%ISOPEN ▫ TRUE si le curseur est ouvert • nomCurseur%FOUND ▫ TRUE si le dernier FETCH contient un tuple • nomCurseur%NOTFOUND ▫ TRUE si le dernier FETCH ne contient pas de tuples • nomCurseur%ROWCOUNT ▫ nombre total de lignes traitées jusqu’à présent (par ex. nombre de FETCH)
  • 21. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 43 Curseur : Exercice • Programme avec curseur ▫ Récupérer tous les films dont ‘Georges Lucas’ est le metteur en scène (MES) ▫ Afficher pour chaque film le titre et l’année ▫ Bonus: Afficher le gain total de tous les films – Somme(recette) - somme(cout) • Schéma : ▫ Film (id_film, titre, id_mes, année, coût, recette) ▫ Artiste (id, nom, prenom, date_naiss) Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 45 Curseur paramétré • Objectif : ▫ paramétrer la requête associée à un curseur – Provient d’une variable temporaire, paramètre du programme • Syntaxe : CURSOR nomCurseur(param1[, param2, …]) IS …; Paramètres : nomPar [IN] type [{:= | DEFAULT} valeur]; (nomPar est inconnu en dehors de la définition !) • Utilisation : OPEN nomCurseur(valeurPar1[, valeurPar2, …]); • Fermeture (CLOSE) avant d utiliser avec d autres paramètres
  • 22. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 46 Curseur Paramétré: Exercice • Programme avec curseur paramétré ▫ Récupérer tous les films d’un MES en paramètre (leMES) ▫ Pour chaque film, affichage : – Si le gain (recette - cout) est supérieur à une valeur donnée (seuil) – Du titre et de l’année ▫ Afficher le nombre de films précédents / total • Schéma : ▫ Film (id_film, titre, id_mes, année, coût, recette) ▫ Artiste (id, nom, prenom, date_naiss) Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 48 Boucle FOR avec curseur • Exécute les instructions pour chaque enregistrement DECLARE CURSOR films(idMES Film.MES%TYPE) IS SELECT * FROM Film WHERE MES = idMES ; leFilm Film%ROWTYPE; nbSup NUMBER(11,2) := 0; total NUMBER(11,2) := 0; BEGIN -- l ouverture du curseur se fait dans le FOR FOR leFilm IN films(leMES) LOOP IF (leFilm.recette - leFilm.cout) > seuil THEN DBMS_OUTPUT.PUT_LINE(leFilm.titre|| : ||leFilm.année); nbSup := nbsup + 1; END IF; total = films%ROWCOUNT; END LOOP; -- Fermeture du curseur (plus de %ROWCOUNT) DBMS_OUTPUT.PUT_LINE( Résultat: || nbSup || / || total); END;
  • 23. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 49 Programmes et Sous-Programmes • Nommage et paramétrage de Blocs ▫ Procédure – Eventuellement retourne DES résultats ▫ Fonction – Résultat unique obligatoire – Appel possible dans une requête SQL • Programmes stockés dans la base ▫ Modularité (conception et maintenance), ▫ Réutilisation ▫ Intégrité (regroupement de traitements dépendants) ▫ Sécurité (gestion des droits/contraintes sur données) • Récursivité autorisée (à utiliser avec précaution) ! • Sous-Programmes ▫ Défini dans le DECLARE Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 50 Appel de programme • Appel de procédure/fonction depuis un bloc PL/SQL : nomProcedure(listeParEffectifs); • Appel de procédure stockée sous SQL*Plus : SQL> EXECUTE nomProcedure(listeParEffectifs); • Appel de fonction stockée sous SQL*Plus : SQL> nomFonction(listeParEffectifs);
  • 24. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 51 Procédures • Syntaxe : CREATE [OR REPLACE] PROCEDURE nomProcedure [(par1 [IN | OUT | IN OUT] [NOCOPY] type1 [{:= | DEFAULT} expression] [, par2 [IN | OUT | IN OUT] [NOCOPY] type2 [{:= | DEFAULT} expression … )] {IS | AS} [declarations;] BEGIN <instructions>; [EXCEPTION <traitementExceptions>; ] END [nomProcedure]; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 52 Paramètres • Types de paramètres : ▫ Entrée (IN) – Valeur constante (pas d’affectation) – Toujours passé par référence ! ▫ Sortie (OUT) – Valeur de retour – Ne peut être qu’affecté (pas utilisé) – Par défaut (sans NOCOPY) passé par valeur ! ▫ Entrée et sortie (IN OUT) – Passé en référence – Valeur de retour – Peut être utilisé et affecté – Par défaut (sans NOCOPY) passé par valeur ! • NOCOPY ▫ Données retours par référence (paramètres volumineux)
  • 25. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 53 Procédure locale : exemple DECLARE -- Procédure locale PROCEDURE lesFilms (prenomParam VARCHAR2(30), nomParam VARCHAR2(30)) IS CURSOR films(lePrenom VARCHAR2(20), leNom VARCHAR2(20)) IS SELECT * FROM Film WHERE MES = (SELECT id FROM Artiste WHERE Nom=leNom and Prenom=lePrenom); leFilm Film%ROWTYPE; BEGIN FOR leFilm IN films(prenomParam,nomParam) LOOP DBMS_OUTPUT.PUT_LINE( ||leFilm.titre|| : ||leFilm.année); END LOOP; END lesFilms; CURSOR mes IS SELECT * FROM Artiste where id in (select MES from Films); leMes Film%ROWTYPE; BEGIN FOR leMes IN mes() LOOP DBMS_OUTPUT.PUT_LINE(leMes.prenom|| ||leMes.nom|| : ); -- Appel de la procédure lesFilms(leMes.prenom,lesMes.nom); END LOOP; END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 54 Fonctions • Syntaxe : CREATE [OR REPLACE] FUNCTION nomFonction [(par1 [IN | OUT | IN OUT] [NOCOPY] type1 [{:= | DEFAULT} expression] [, par2 [IN | OUT | IN OUT] [NOCOPY] type2 [{:= | DEFAULT} expression … )] -- OUT a éviter (effets de bords) RETURN typeRetour {IS | AS} [declarations;] BEGIN <instructions>; … RETURN varRetour; -- return obligatoire [EXCEPTION <traitementExceptions>; ] END[nomFonction];
  • 26. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 55 Fonctions : Exemple DECLARE FUNCTION nbFilms (idMES Film.MES%TYPE) RETURN INTEGER IS nbFilm INTEGER; BEGIN SELECT COUNT(*) INTO nbFilm FROM Film WHERE MES = idMES; RETURN nbFilm; END nbFilms; CURSOR mes IS SELECT * FROM Artiste where id in (select MES from Film); leMes Film%ROWTYPE; nbFilm INTEGER; BEGIN FOR leMes IN mes() LOOP nbFilm := nbFilms(leMes.id); DBMS_OUTPUT.PUT_LINE(leMes.prenom|| ||leMes.nom|| : ||nbFilm); END LOOP; END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 56 Fonction stockée : exemple • Appel depuis SQL*Plus : SQL> SELECT prenom, nom, nbFilms(id) FROM Artiste WHERE id in (select MES from Film);
  • 27. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 57 Manipulation de programme • Création ou modification de sous-programme : CREATE [OR REPLACE] {PROCEDURE | FUNCTION} nom … • Recompilation automatique lors d une modification ▫ Pour une compilation manuelle : ALTER {PROCEDURE | FUNCTION} nom COMPILE ▫ Affichage des erreurs de compilation sous SQL*Plus : SHOW ERRORS • Suppression de sous-programme : DROP {PROCEDURE | FUNCTION} nom Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 58 Paquetages • Paquetage ▫ Regroupement variables, curseurs, fonctions, procédures, etc. ▫ Ensemble cohérent de services • Encapsulation ▫ Accès extérieurs ▫ Accès privés (internes au paquetage) • Structure ▫ Section de spécification – Déclaration des variables et curseurs, – Déclaration sous-programmes accessibles depuis l’extérieur ▫ Section d’implémentation – Code des sous-programmes accessibles depuis l’extérieur – Sous-programmes accessibles en interne (privés)
  • 28. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 59 Section de spécification • Syntaxe : CREATE [OR REPLACE] PACKAGE nomPaquetage {IS | AS} [declarationTypeRECORDpublique …; ] [declarationTypeTABLEpublique …; ] [declarationSUBTYPEpublique …; ] [declarationRECORDpublique …; ] [declarationTABLEpublique …; ] [declarationEXCEPTIONpublique …; ] [declarationCURSORpublique …; ] [declarationVariablePublique …; ] [declarationFonctionPublique …; ] [declarationProcedurePublique …; ] END [nomPaquetage]; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 60 Spécification : exemple CREATE PACKAGE gestionMES AS … FUNCTION nbFilms(idMES Film.MES%TYPE) RETURN INTEGER; FUNCTION leMES(titreFilm Film.MES%TYPE) RETURN INTEGER; PROCEDURE filmParMES(); … END gestionMES;
  • 29. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 61 Section d implémentation • Syntaxe : CREATE [OR REPLACE] PACKAGE BODY nomPaquetage {IS | AS} [declarationTypePrive …; ] [declarationObjetPrive …; ] [definitionFonctionPrivee …; ] [definitionProcedurePrivee …; ] [instructionsFonctionPublique …; ] [instructionsProcedurePublique …; ] END [nomPaquetage]; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 62 Implémentation : exemple (1/2) CREATE PACKAGE BODY gestionMES AS -- Fonction publique : Nombre de films pour un Metteur en scène FUNCTION nbFilms(idMES Film.MES%TYPE) RETURN INTEGER IS nbFilm INTEGER; BEGIN SELECT COUNT(*) INTO nbFilm FROM Film WHERE MES = idMES; RETURN nbFilm; END nbFilms; -- Fonction publique : Retourne l id du metteur en scène à partir d une titre de film FUNCTION leMES(titreFilm Film.MES%TYPE) RETURN INTEGER IS idMES Film.MES%TYPE; BEGIN SELECT MES INTO idMES FROM Film WHERE title like titreFilm; RETURN idMES; END leMES; /* Fonction publique : Affiche pour chaque metteur en scène provenant un curseur privé : - son prenom et son nom - appel une procédure d affichage de tous ses films */ PROCEDURE filmParMES() IS leMES Artiste%ROWTYPE; BEGIN FOR leMES IN lesMES() LOOP DBMS_OUTPUT.PUT_LINE(leMES.prenom|| ||leMES.nom); lesFilms (leMES.id); END LOOP; END filmParMES;
  • 30. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 63 Implémentation : exemple (2/2) -- Curseur privé : liste tous les artistes metteurs en scène CURSOR lesMES() IS SELECT * FROM Artiste where id in (select MES from Films); -- Procédure privée : affiche tous les films d un metteur en scène PROCEDURE lesFilms (leMES Film.MES%TYPE) IS CURSOR films (idMES Film.MES%TYPE) IS SELECT * FROM Film where MES = idMES ORDER BY année; leFilm FILM%ROWTYPE; BEGIN FOR leFilm IN films(leMES) LOOP DBMS_OUTPUT.PUT_LINE( ||leFilm.titre|| ||leFilm.année); END LOOP; END lesFilms; END gestionMES; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 64 Référence au paquetage • Uniquement sur les objets et programmes publics • Syntaxe : nomPaquetage.nomObjet nomPaquetage.nomSousProgramme(…)
  • 31. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 65 Manipulation d un paquetage • Re-compilation d un paquetage : ▫ CREATE OR REPLACE PACKAGE ▫ Modification d’une sections Øre-compilation automatique de l’autre section ▫ Erreurs de compilation avec SQL*Plus : SHOW ERRORS • Suppression d un paquetage : DROP BODY nomPaquetage; DROP nomPaquetage; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 66 Exceptions • Conditions d erreur lors de l exécution • EXCEPTION ▫ Clause de récupération d’erreur ▫ Evite l’arrêt systèmatique du programme • Possibilité de définir des erreurs
  • 32. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 67 Traitement des exceptions • Syntaxe : BEGIN … EXCEPTION WHEN nomException1 [OR nomException2 …] THEN instructions1; WHEN nomException3 [OR nomException4 …] THEN instructions3; WHEN OTHERS THEN instructionsAttrapeTout; END; • Affichage de l erreur DBMS_OUTPUT.PUT_LINE(SQLERRM || : || SQLCODE); Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 68 Lors d une exception 1. Aucun traitement n est prévu Ø le programme s’arrête 2. Un traitement est prévu : ▫ Arrêt de l’exécution du bloc PL/SQL courant ▫ L’exception est recherchée dans la section EXCEPTION – Associée au bloc courant, – Sinon dans les blocs parents – Sinon le programme appelant ▫ Exception traitée suivant les instructions trouvées – Spécifiques – Attrape-tout ▫ Exécution du traitement prévu par l’exception (THEN…) ▫ Suite de l’exécution dans le bloc/programme parent
  • 33. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 69 Suivi des exceptions DECLARE … BEGIN … … … … … … … … EXCEPTION … END; DECLARE … BEGIN … … … … EXCEPTION … END; DECLARE … BEGIN … … EXCEPTION … END; ? ? Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 70 Mécanismes de déclenchement 1. Déclenchement automatique • Erreurs prédéfinies Oracle • VALUE_ERROR, ZERO_DIVIDE, TOO_MANY_ROWS, etc. 2. Déclenchement programmé • Dans DECLARE : nomException EXCEPTION; • Dans BEGIN : RAISE nomException; • Dans EXCEPTION : WHEN nomException THEN
  • 34. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 71 Mécanismes de déclenchement (2) • Déclenchement ▫ avec message et code d’erreur personnalisé : RAISE_APPLICATION_ERROR( numErr, messageErr,[TRUE | FALSE]); ▫ TRUE : mise dans une pile d’erreurs à propager (par défaut) ; FALSE : remplace les erreurs précédentes dans la pile Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 72 Transactions • Objectif : ▫ Cohérence d’une suite de maj sur des données État cohérent 2 de la base Commit Instruction 1 Instruction 2 … Instruction n Rollback État cohérent 1 de la base Perturbation
  • 35. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 73 Transactions : contrôle • Début ▫ 1° SQL après le BEGIN ▫ 1° SQL après une transaction • Fin ▫ Avec succès : COMMIT [WORK]; ▫ Échec : ROLLBACK [WORK]; ▫ Fin implicite – Avec succès : fin normale d’une session – Échec : fin anormale d’une session Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 74 Transactions : contrôle (2) • Annulations partielles SAVEPOINT nomPoint; -- insertion point de validation ROLLBACK TO nomPoint; -- retour à l état au nomPoint • Remarques : ▫ Sortie suite à une exception non traitée – Pas de ROLLBACK implicite – Opérations réalisées dans le sous-programme non annulées
  • 36. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données 75 Transactions/Exceptions : exemple CREATE PROCEDURE ajoutFilm () IS nvFilm Film%ROWTYPE; nbFilm INTEGER; mesErreur EXCEPTION; filmErreur EXCEPTION; BEGIN SELECT MAX(id)+1 INTO film.id FROM Film; nvFilm.titre := DBMS_OUTPUT.GET_LINE( Titre= ,1); nvFilm.MES := trouver_idMES(); IF nvFilm.MES IS NULL OR nvFilm.MES = 0 THEN RAISE mesErreur; END IF; nvFilm.annee := DBMS_OUTPUT.GET_LINE( Année= ,1); nvFilm.cout := DBMS_OUTPUT.GET_LINE( Cout= ,1); nvFilm.recette := DBMS_OUTPUT.GET_LINE( Recette= ,1); INSERT INTO Film values (nvFilm.id, nvFilm.titre, nvFilm.MES, nvFilm.cout, nvFilm.recette); SELECT COUNT(*) INTO nbFilm FROM Film where titre = nvFilm.titre AND annee = nvFilm.annee; IF nbFilm > 1 THEN RAISE filmErreur; END IF; COMMIT; EXCEPTION WHEN mesErreur THEN DBMS_OUTPUT.PUT_LINE( Metteur en scène inconnu ); WHEN filmErreur THEN DBMS_OUTPUT.PUT_LINE( Film déjà existant ); ROLLBACK; WHEN OTHERS THEN ROLLBACK; END; Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données PL/SQL et MySQL • Quelques différences : ▫ Déclaration d’une variable : DECLARE var <type>; ▫ Affectation de variable : SET variable = <expr>; ▫ Curseurs : – DECLARE cur CURSOR FOR <SQL>; – FETCH cur INTO a, b, c; (plusieurs variables) ▫ Pas de boucles FOR ▫ Afficher des données : SELECT – SELECT concat(‘texte : ’, var, ‘. Texte’) ; ▫ Exceptions – Déclarer un “maître” (Handler) pour l’erreur – Valable pour la procédure à partir de la déclaration – Différents types d’actions 76
  • 37. Procédures stockées : PL/SQL N. Travers Introduction aux Bases de Données Mysql et Erreurs DECLARE <type d’action> HANDLER FOR <condition d’erreur> [, <condition>] ... <statement> • Type d’action : ▫ CONTINUE / EXIT / UNDO • Condition d’erreur : ▫ Erreur MySQL : SQLSTATE [VALUE] <sqlstate value> – http://dev.mysql.com/doc/refman/5.0/fr/error-handling.html – Ex : 23000 : valeur unique, 42000 : incorrect/inconnu/interdit ▫ SQLWARNING / NOT FOUND / SQLEXCEPTION 77