0% ont trouvé ce document utile (0 vote)
41 vues16 pages

PL SQL

Le document décrit le langage PL/SQL qui permet de créer des blocs de code exécutables sur un serveur de bases de données. PL/SQL ajoute des fonctionnalités procédurales comme les boucles et les contrôles conditionnels au langage SQL. Le document explique également la gestion des curseurs et des variables dans PL/SQL.

Transféré par

walid annad
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)
41 vues16 pages

PL SQL

Le document décrit le langage PL/SQL qui permet de créer des blocs de code exécutables sur un serveur de bases de données. PL/SQL ajoute des fonctionnalités procédurales comme les boucles et les contrôles conditionnels au langage SQL. Le document explique également la gestion des curseurs et des variables dans PL/SQL.

Transféré par

walid annad
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

Le Langage de BLOC

PL/SQL

Le Langage de Bloc
PL/SQL # SQL

• SQL : langage ensembliste


– Ensemble de requêtes distinctes
– Langage de 4ème génération : on décrit le résultat sans dire
comment il faut accéder aux données
– Obtention de certains résultats : encapsulation dans un
langage hôte de 3ème génération
• PL/SQL
– ‘Procedural Language’ : sur-couche procédurale à SQL,
boucles, contrôles, affectations, exceptions, ….
– Chaque programme est un bloc (BEGIN – END)
– Programmation adaptée pour :
• Transactions
• Une architecture Client - Serveur

1
Requêtes SQL

• Chaque requête ‘client’ est transmise au serveur de


données pour être exécutée avec retour de résultats

CLIENT SERVEUR
INSERT INTO … Exécute INSERT
Résultat
DELETE FROM … Exécute DELETE
Résultat
UPDATE … Exécute UPDATE
Résultat
SELECT …
Exécute SELECT
……. Résultat

Bloc PL/SQL

• Le bloc de requêtes est envoyé sur le serveur.


Celui-ci exécute le bloc et renvoie 1 résultat final.

CLIENT SERVEUR

BEGIN
Exécution
INSERT …
SI …. ALORS du bloc
SELECT … PL/SQL
FSI
END;
Résultat

2
Format d’un bloc PL/SQL

• Section DECLARE : déclaration de


– Variables locales simples
DECLARE
– Variables tableaux
– cursors --déclarations

• Section BEGIN BEGIN


– Section des ordres exécutables --exécutions
– Ordres SQL EXCEPTION
– Ordres PL --erreurs
• Section EXCEPTION END;
– Réception en cas d’erreur
/
– Exceptions SQL ou utilisateur

Variables simples

• Variables de type SQL


nbr NUMBER(2) ;
nom VARCHAR(30) ;
minimum CONSTANT INTEGER := 5 ;
salaire NUMBER(8,2) ;
debut NUMBER NOT NULL ;

• Variables de type booléen (TRUE, FALSE, NULL)

fin BOOLEAN ;
reponse BOOLEAN DEFAULT TRUE ;
ok BOOLEAN := TRUE;

3
Variables faisant référence
au dictionnaire de données

• Référence à une colonne (table, vue)


vsalaire [Link]%TYPE;
vnom [Link]%TYPE;
Vcomm vsalaire%TYPE;
• Référence à une ligne (table, vue)
vemploye employe%ROWTYPE;
vetudiant etudiant%ROWTYPE;

– Variable de type ‘struct’


– Contenu d’une variable : [Link]

[Link]
7

Instructions PL

• Affectation (:=)
– A := B;
• Structure alternative ou conditionnelle
– Opérateurs SQL : >,<,….,OR,AND,….,BETWEEN,LIKE,IN
– IF …. THEN ….. ELSE ……END IF;

IF condition THEN
instructions;
ELSE
instructions;
IF condition THEN instructions;
ELSIF condition THEN instructions;
ELSE instructions;
END IF;

4
Structure alternative : CASE (1)

• Choix selon la valeur d’une variable

CASE variable

WHEN valeur1 THEN action1;


WHEN valeur2 THEN action2;
………
ELSE action;

END CASE;

Structure alternative : CASE (2)

• Plusieurs choix possibles

CASE

WHEN expression1 THEN action1;


WHEN expression2 THEN action2;
………
ELSE action;

END CASE;

10

5
Structure itérative

LOOP
• LOOP instructions;
EXIT WHEN (condition);
END LOOP;

FOR (indice IN [REVERSE] borne1..borne2) LOOP


• FOR instructions;
END LOOP;

• WHILE WHILE (condition) LOOP


instructions;
END LOOP;

11

Affichage de résultats intermédiaires


Package DBMS_OUTPUT

• Messages enregistrés dans une mémoire tampon côté serveur


• La mémoire tampon est affichée sur le poste client à la fin

Serveur ORACLE
Client SQLPLUS BEGIN
DBMS_OUTPUT.PUT_LINE('Message1');
DBMS_OUTPUT.PUT_LINE('Message2');
Message1 DBMS_OUTPUT.PUT_LINE('Message3');
Message2 END;
Message3

Message1
Message2
Message3
SQL>SET SERVEROUT ON
Mémoire tampon
12

6
Le package DBMS_OUTPUT

• Écriture dans le buffer avec saut de ligne


– DBMS_OUTPUT.PUT_LINE(<chaîne caractères>);
• Écriture dans le buffer sans saut de ligne
– DBMS_OUTPUT.PUT(<chaîne caractères>);
• Écriture dans le buffer d’un saut de ligne
– DBMS_OUTPUT.NEW_LINE;

DBMS_OUTPUT.PUT_LINE('Affichage des n premiers ');


DBMS_OUTPUT.PUT_LINE('caractères en ligne ');
FOR i IN 1..n LOOP
DBMS_OUTPUT.PUT(tab_cars(i));
END LOOP;
DBMS_OUTPUT.NEW_LINE;

13

Sélection mono – ligne


SELECT …. INTO

• Toute valeur de colonne est rangée dans une


variable avec INTO
SELECT nom,adresse,tel INTO vnom,vadresse,vtel
FROM etudiant WHERE ide=matricule;

SELECT nom,adresse,libDip INTO vnom,vadresse,vdip


FROM etudiant e, diplôme d WHERE ine=matricule
AND [Link]=[Link];

• Variable ROWTYPE
SELECT * INTO vretud FROM etudiant WHERE ine=matricule;
…………
DBMS_OUTPUT.PUT_LINE('Nom étudiant : '||[Link]);
…………
14

7
Sélection multi – ligne : les CURSEURS
Principe des curseurs

• Obligatoire pour sélectionner plusieurs lignes


• Zone mémoire (SGA : Share Global Area)
partagée pour stocker les résultats
• Le curseur contient en permanence l’@ de la
ligne courante
• Curseur implicite
– SELECT t.* FROM table t WHERE ……
– t est un curseur utilisé par SQL
• Curseur explicite
– DECLARE CURSOR

15

Démarche générale des curseurs

• Déclaration du curseur : DECLARE


– Ordre SQL sans exécution
• Ouverture du curseur : OPEN
– SQL ‘monte‘ les lignes sélectionnées en SGA
• Sélection d’une ligne : FETCH
– Chaque FETCH ramène une ligne dans le programme
client
– Tant que ligne en SGA : FETCH
• Fermeture du curseur : CLOSE
– Récupération de l’espace mémoire en SGA

16

8
Traitement d’un curseur

Programme PL/SQL
SGA
FETCH

variables

DECLARE
CURSOR c1 IS SELECT ……;
BEGIN
OPEN c1;
FETCH c1 INTO ………;
WHILE (c1%FOUND) LOOP
………
……… OPEN
FETCH c1 INTO ………;
END LOOP;
CLOSE c1;
END;
BD

17

Gestion ‘classique’ d’un curseur

DECLARE
CURSOR c1 IS SELECT nom,moyenne FROM etudiant;
vnom [Link]%TYPE;
vmoyenne [Link]%TYPE;
e1 ,e2 NUMBER;
BEGIN
OPEN c1;
FETCH c1 INTO vnom,vmoyenne;
WHILE c1%FOUND LOOP
IF vmoyenne < 10 THEN e1:=e1+1;
INSERT INTO liste_refus VALUES(vnom);
ELSE e2:=e2+1;
INSERT INTO liste_recus VALUES(vnom);
END IF;
FETCH c1 INTO vnom,vmoyenne;
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e2)||'Reçus ');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(e1)||‘Refus ');
COMMIT;
END;
18

9
Les variables système des Curseurs

• Curseur%FOUND
– Variable booléenne
– Curseur toujours ‘ouvert’ (encore des lignes)
• Curseur%NOTFOUND
– Opposé au précédent
– Curseur ‘fermé’ (plus de lignes)
• Curseur%COUNT
– Variable number
– Nombre de lignes déjà retournées
• Curseur%ISOPEN
– Booléen : curseur ouvert ?

19

Gestion des Exceptions


Principe
• Toute erreur (SQL ou applicative) entraîne
automatiquement un débranchement vers le
paragraphe EXCEPTION :
Débranchement involontaire (erreur SQL)
BEGIN
ou volontaire (erreur applicative)
instruction1;
instruction2;
……
instructionn;
EXCEPTION
WHEN exception1 THEN
………
WHEN exception2 THEN
………
WHEN OTHERS THEN
………
END;
20

10
Deux types d’exceptions

• Exceptions SQL
– Déjà définies (pas de déclaration)
• DUP_VAL_ON_INDEX
• NO_DATA_FOUND
• OTHERS
– Non définies
• Déclaration obligatoire avec le n° erreur (sqlcode)

nomerreur EXCEPTION;
PRAGMA EXCEPTION_INIT(nomerreur,n°erreur);

• Exceptions applicatives
– Déclaration sans n° erreur
nomerreur EXCEPTION;

21

Exemple de gestion d’exception (2)

DECLARE
enfant_sans_parent EXCEPTION;
PRAGMA EXCEPTION_INIT(enfant_sans_parent,-2291);
BEGIN
INSERT INTO fils VALUES ( ……. );

EXCEPTION
WHEN enfant_sans_parent THEN
………
WHEN OTHERS THEN
………
END;

22

11
Procédures Stockées

Fonctions

Procédures Stockées : Principe (1)

• Programme (PL/SQL) stocké dans la base


• Le programme client exécute ce programme en
lui passant des paramètres (par valeur)
• Si le code est bon , le SGBD conserve le
programme source (USER_SOURCE) et le
programme compilé
• Le programme compilé est optimisé en tenant
compte des objets accélérateurs (INDEX, …)

24

12
Procédures Stockées : Principe (2)

CLIENT SERVEUR

PROCEDURE P(v1,v2) AS
EXECUTE P(p1, p2); P
BEGIN
Ordre SQL et PL/SQL
………..
END P;
Retour résultats

25

Déclaration d’une procédure stockée

CREATE [OR REPLACE] PROCEDURE <nom_procédure>


[(variable1 type1, ..., variablen typen [OUT])] AS
...
-- déclarations des variables et
-- curseurs utilisées dans le corps de la procédure
BEGIN
....
-- instructions SQL ou PL/SQL
EXCEPTION
....
END;
/

26

13
Exemple 1 de procédure stockée
inscription d’un étudiant

CREATE PROCEDURE inscription (ide varchar2(10),pnom


varchar2(30),spec varchar2(30),ann_ins number)
AS

BEGIN

DBMS_OUTPUT.PUT_LINE('Début inscription de ||pnom');


INSERT INTO etudiant VALUES(ide,pnom,spec);
INSERT INTO inscrire VALUES(ide,ann_ins);
DBMS_OUTPUT.PUT_LINE('Transaction réussie');
COMMIT;

END;
/

27

Exemple 1 : appel de la procédure

• A partir de sqlplus
ACCEPT vide PROMPT 'Entrer le matricule : '
…………
EXECUTE inscription(‘&ide’,'&vnom',’&an_ins‘,
&spec’);

• A partir de PL/SQL
inscription(ide,nom,an_ins, spec);

28

14
Les Fonctions stockées

• Comme une procédure mais qui ne retourne


qu’un seul résultat
• Même structure d’ensemble qu’une procédure
• Utilisation du mot clé RETURN pour retourner le
résultat
• Appel possible à partir de :
– Une requête SQL normale
– Un programme PL/SQL
– Une procédure stockée ou une autre fonction stockée

29

Déclaration d’une fonction stockée

CREATE [OR REPLACE] FUNCTION nom_fonction


[(paramètre1 type1, ……… , paramètren typen)]
RETURN type_résultat IS
-- déclarations de variables,curseurs et exceptions
BEGIN
-- instructions PL et SQL

RETURN(variable);
END;
/

1 ou plusieurs RETURN

30

15
Exemple de fonction stockée

CREATE OR REPLACE FUNCTION moy_points_marques


(eqj [Link]%TYPE)
RETURN NUMBER IS
moyenne_points_marques NUMBER(4,2);
BEGIN
SELECT AVG(totalpoints) INTO moyenne_points_marques
FROM joueur WHERE ideq=eqj;
RETURN(moyenne_points_marques);
END;
/

31

Utilisation d’une fonction

• A partir d’une requête SQL


SELECT moy_points_marques('e1') FROM dual;

SELECT nomjoueur FROM joueur WHERE


totalpoints > moy_points_marques('e1');

• A partir d’une procédure ou fonction

BEGIN
………
IF moy_points_marques(equipe) > 20 THEN ………

END;

32

16

Vous aimerez peut-être aussi