Oracle PLSQL
Oracle PLSQL
DECLARE
Déclaration de variables, constantes, exceptions, curseurs
BEGIN [<<nom-bloc>>]
Instructions SQLet PL/SQL
EXCEPTION
traitements des exceptions (gestion des erreurs)
END ; ou [END nom-bloc]
Remarques :
• Les sections DECLARE et EXCEPTION sont facultatives.
Professeur : ASSALE Adjé Louis 1/24 INP-HB Professeur : ASSALE Adjé Louis 2/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
• Chaque instruction de n’importe quelle section est terminée par un point 3.1 Types de variables utilisées en PL/SQL
virgule (;)
• Dans la section BEGIN, possibilité d’inclure des sous-blocs(imbrication Variables locales :
de blocs) • type scalaire,
• Possibilité de placer des commentaires: • type composé
-- commentaires sur une ligne ou
/* commentaires sur plusieurs lignes */ Variables de l’environnement extérieur à PL/SQL :
Un bloc PL/SQL s’édite généralement dans un fichier de commandes. C’est un • champs d’écran ou SQL*FORMS (préfixé de ″ :″) ;
fichier texte, dont l’exécution dans SQL*PLUS s’effectue par : • variables définies en langage hôte dans PRO*(les variables sont toujours
Start chemin\nom_fichier précédées de ":" ;
On peut inclure dans ce fichier, les commandes de SQL*PLUS suivantes : • variables définies dans SQL * plus par Accepte (préfixé de "&") par
Prompt message qui permet d’afficher un message Variable (préfixé de ″ :″).
Accept variable qui permet de rentrer une information (variable de
SQL*PLUS)
3.2 Déclaration de variables et constante
2.2 Exemple
Les variables locales se définissent dans la partie DECLARE d’un bloc PL/SQL.
Prompt nom de produit désiré - Variables PL/SQL de type scalaire :
Accept nom_ prod outre les types CHAR, NUMBER, DATE et VARCHAR2 disponible dans le
DECLARE langage SQL, PL/SQL offre les types supplémentaires suivants : BOOLEAN,
qte_stock Number(5); SMALLINT, BINARY_INTEGER, DECIMAL, FLOAT, INTEGER, REAL,
BEGIN ROWID.
SELECT quantite into qte_stock Syntaxe :
FROM stock nom_var CHAR ; --longeur maxi 255
WHERE produit= '&nom_prod'; nom_var NUMBER ; -- longueur maxi 38
-- contrôler et mettre à jour ce stock nom_var DATE ; --(DD-MON-YY)
IF qte_stock>o
THEN UPDATE stock Exemples
SET quantite = quantite - 1 DECLARE
WHERE produit= '&nom_prod'; nom char(15) ;
INSERT into Vente numero number ;
VALUES ('&nom_prod'||'vendu', sysdate) ; date_ jour date ;
ELSE salaire number (7,2) ;
INSERT into commande BEGIN
VALUES ('&nom_prod'||'Demande', sysdate) ; …
END IF; END ;
COMMIT;
END;
DECLARE
3. Les variables reponse Boolean ;
BEGIN
Professeur : ASSALE Adjé Louis 3/24 INP-HB Professeur : ASSALE Adjé Louis 4/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
… <nom_champ> <type_champ>, …)
END ; 2. Déclaration de la variable de type enregistrement
nom_variable nom_type ;
Il est possible de déclarer une variable par référence à une colonne d’une table
par la notation %type, selon la syntaxe : Emeple :
nom _variable nom_table.nom_colonne%TYPE ; TYPE notation IS RECORD
Exemple : (nom etudiant.nom%type, cours matiere.mat%type,
DECLARE note suit.note%type) ;
le_nom etudiant.Nom%TYPE ; note_etud notation ;
BEGIN
… • variable de type table
END ; Le type table représente une structure composée d’éléments d’un même type
scalaire. L’accès à un élément de la table s’effectue grâce à un indice, ou clé
- Variables de type composé : primaire, déclaré de type BINARY_INTEGER qui permet de stocker des
valeurs entières signées. La déclaration s’effectue en 2 étapes
• variable reprenant la même structure qu’une ligne d’une table : 1. Déclaration du type de l’élément de la table :
TYPE <nom_type> IS TABLE of <type_champ> INDEX BY
Syntaxe : BINARY_INTEGER ;
nom_var table%ROWTYPE ; 2. Déclaration de la variable de type table
nom_variable nom_type ;
Exemple
DECLARE Exemple :
enreg etudiant%ROWTYPE ; TYPE t_nom iS TABLE OF Varchar(10) INDEX BY BINARY-
BEGIN INTEGER ;
… Table_nom t_nom;
END
Enreg
Definition de constantes:
nom_variable <type> DEFAULT <valeur> ;
Ou nom_variable CONSTANT <type> := <valeur> ;
• variable de type RECORD : Une variable est visible dans le bloc ou elle a été déclarée, et dans les blocs
la déclaration s’effectue en deux étapes : imbriqués si elle n’a pas été redéfinie.
1. Déclaration du type enregistrement
TYPE <nom_type> IS RECORD (<nom_champ> <type_champ>, - L’opérateur :=
Professeur : ASSALE Adjé Louis 5/24 INP-HB Professeur : ASSALE Adjé Louis 6/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Professeur : ASSALE Adjé Louis 7/24 INP-HB Professeur : ASSALE Adjé Louis 8/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Syntaxe :
FOR indice IN [REVERSE] exp1..exp2
Professeur : ASSALE Adjé Louis 9/24 INP-HB Professeur : ASSALE Adjé Louis 10/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Professeur : ASSALE Adjé Louis 11/24 INP-HB Professeur : ASSALE Adjé Louis 12/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Après l’exécution du SELECT les lignes ramenées sont traitées une par une, la Les attributs d’un curseur (implicite ou explicite) sont des indicateurs sur l’état
valeur de chaque colonne du SELECT doit être stockée dans une variable du curseur.
réceptrice. %FOUND concerne la dernière ligne traitée
Syntaxe : %NOTFOUND
FETCH nom_ curseur INTO liste_ variables ; % ISOPEN concerne l’ouverture d’un curseur
% ROWCOUNT concerne le nombre de lignes déjà traitées
Le FETCH ramène une seule ligne à la fois : pour traiter n lignes, prévoir une
boucle. - Attribut %FOUND :
Il est de type booléen.
EXEMPLE • Pour un curseur implicite la syntaxe est : SQL%FOUND la valeur est
DECLARE TRUE (vrai) quand pour les instructions INSERT UPDATE DELETE
CURSOR roman is une ligne au moins a été traitée. Pour l’instruction SELECT… INTO
SELECT titre, auteur, prix FROM livre une ligne et une seule a été ramenée.
WHERE genre = roman
Professeur : ASSALE Adjé Louis 13/24 INP-HB Professeur : ASSALE Adjé Louis 14/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
• Pour curseur explicite la syntaxe est : nom_ curseur%FOUND la THEN INSERT INTO Resultat
valeur est TRUE quand le dernier FETCH a ramené une ligne VALUES (titre_l, nom, cout_l);
END IF ;
EXEMPLE. END LOOP;
DECLARE CLOSE roman;
CURSOR roman IS END ;
…
… - Attribut %ISOPEN
BEGIN
OPEN roman; Est de type booléen
FETCH roman INTO titre_l,nom, cout_l ; • Curseur implicite: SQL %ISOPEN toujours à FALSE car oracle
WHILE roman%FOUND renferme les curseurs après utilisation.
LOOP • Curseur explicite : nom_curseur%ISOPEN renvoie la valeur TRUE
IF cout_l > 100 quand le curseur est ouvert.
THEN INSERT INTO Resultat
VALUES( titre_l , nom, cout_l) ; EXEMPLE
END IF ; DECLARE
FETCH roman INTO titre_l, nom, cout_l ; CURSOR roman IS
END LOOP; …
CLOSE roman; BEGIN
END; IF NOT(roman%ISOPEN)
THEN OPEN roman;
- Attribut %NOTFOUND END IF ;
Est de type booléen. LOOP
• Curseur implicite: SQL%NOTFOUND FETCH INTO titre_l,nom,cout_l
la valeur est TRUE quand les instructions INSERT, UPDATE et EXIT WHEN roman%NOTFOUND ;
DELETE ne traitent aucune ligne et quand l’instruction SELECT … IF cout_l>100
INTO ne ramène pas de lignes. THEN INSERT INTO Resultat
• Curseur explicite : nom_curseur%NOTFOUND la valeur est TRUE VALUES(titre_l, nom, cout_l) ;
quand le dernier FETCH n’a pas ramené de ligne. END IF;
END LOOP;
EXEMPLE CLOSE roman;
DECLARE END;
CURSOR roman IS
SELECT titre, auteur, prix FROM Livre - Attribut %ROWCOUNT
WHERE genre = ‘roman’ est de type numérique
ORDER BY prix ; • Curseur implicite : SQL%ROWCOUNT ramène pour les instructions
BEGIN INSERT, UPDATE et DELETE le nombre de lignes traitées.
OPEN roman; Quand l’instruction SELECT…INTO :
LOOP ne ramène aucune ligne, il renvoie 0
FETCH INTO titre_l, nom, cout_l ramène exactement une ligne, il renvoie 1
EXIT WHEN roman %NOTFOUND; ramène plus d’une ligne, il renvoie 2
IF cout_l > 100
Professeur : ASSALE Adjé Louis 15/24 INP-HB Professeur : ASSALE Adjé Louis 16/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Professeur : ASSALE Adjé Louis 17/24 INP-HB Professeur : ASSALE Adjé Louis 18/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Professeur : ASSALE Adjé Louis 19/24 INP-HB Professeur : ASSALE Adjé Louis 20/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
UPDATE livre SET prix = prix *1.5 7.2 Anomalie programme utilisateur
WHERE CURRENT OF cout ;
END IF; Syntaxe :
END LOOP; DECLARE
END; …
nom_erreur EXCEPTION ;
EXEMPLE2: créer une table type de deux colonnes genre et total. Remplir la …
colonne genre des différents genres de livre, mettre à jour la colonne total avec BEGIN
la somme totale des prix des livres. …
DECLARE IF (anomalie)
CURSOR c_type IS SELECT genre, total FROM type FOR UPDATE THEN RAISE nom_erreur;
OF total …
BEGIN EXCEPTION
FOR genre_type IN c_type WHEN nom_erreur THEN (traitement) ;
LOOP UPDATE type END ;
SET total = (SELECT sum(prix) FROM livre WHERE genre =
genre_type.genre) Remarque : on sort du bloc après exécution du traitement
WHERE CURRENT OF c_ type;
END LOOP; Exemple : diminution des prix des livres de 100 francs
END;
/ DECLARE
SELECT * FROM livre Prix_limite EXCEPTION ;
/ CURSOR cout IS SELECT titre, prix
FROM livre
7. Gestion des erreurs ORDER BY prix DESC
FOR UPDATE OF prix
BEGIN
7.1 Section exception FOR cout_rec IN cout
LOOP
La section EXCEPTION permet d’afficher un traitement approprié aux erreurs IF cout_rec prix >100
survenues lors de l’exécution du bloc PL/SQL. THEN INSERT INTO Resultat
On distingue deux types d’erreurs : VALUES(cout_rec.titre, cout_rec.prix - 100) ;
• Erreur interne ORACLE (SLQCODE !=0) UPDATE livre SET prix = prix - 100
• Erreur programme utilisateur. WHERE CURRENT OF cout;
ELSE RAISE prix_limite ;
Règles à respecter : END IF;
• Définir et donner un nom à chaque erreur (différent pour erreur END LOOP ;
utilisateur et erreur ORACLE) EXCEPTION
• Associer le nom d’erreur à la section EXCEPTION dans la partie WHEN prix_limite THEN
DECLARE. INSERT INTO resultat2
• Définir le traitement à effectuer dans la partie EXCEPTION VALUES (‘prix inférieur à 100f’) ;
END ;
Professeur : ASSALE Adjé Louis 21/24 INP-HB Professeur : ASSALE Adjé Louis 22/24 INP-HB
ORACLE Langage PL/SQL ORACLE Langage PL/SQL
Professeur : ASSALE Adjé Louis 23/24 INP-HB Professeur : ASSALE Adjé Louis 24/24 INP-HB