Télécharger la présentation
1
PL/SQL Noreddine GHERABI 1
2
Introduction PL/SQL est un langage propriétaire de Oracle
Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire si on ne peut utiliser des variables et les structures de programmation comme les boucles et les alternatives Utilisation de PL/SQL PL/SQL peut être utilisé pour l’écriture des procédures stockées et des triggers (Oracle accepte aussi le langage Java) Il convient aussi pour écrire des fonctions utilisateurs qui peuvent être utilisées dans les requêtes SQL (en plus des fonctions prédéfinies) Il est aussi utilisé dans des outils Oracle, Forms et Report en particulier PL/SQL est un langage propriétaire de Oracle 2
3
Structure d’un programme
Un programme est structuré en blocs d’instructions de 3 types : procédures anonymes procédures nommées fonctions nommées DECLARE -- définitions de variables BEGIN -- Les instructions à exécuter EXCEPTION -- La récupération des erreurs END; 3
4
Variables Identificateurs Oracle : 30 caractères au plus
Commence par une lettre Peut contenir lettres, chiffres, _, $ et # Pas sensible à la casse Types de variables Les types habituels correspondants aux types SQL2 , Oracle : integer, varchar,… Types composites adaptés à la récupération des colonnes et lignes des tables SQL :%TYPE, %ROWTYPE 4
5
Variables Déclaration d’une variable
identificateur [CONSTANT] type [:= valeur]; Exemples : age integer:=20; nom varchar(30); dateNaissance date; ok boolean := true; PI CONSTANT REAL:=500; Déclarations multiples interdites : On peut déclarer qu’une variable est du même type qu’une colonne d’une table (ou qu’une autre variable) : NC client.nom.%TYPE; Age number; Age1 age%type; 5
6
Variables Une variable peut contenir toutes les colonnes d’une ligne d’une table employe emp%ROWTYPE; déclare que la variable employe contiendra une ligne de la table emp Exemple d’utilisation nom emp.nome%TYPE; select * INTO employe from emp where matr = 900; nom := employe.nome; employe.dept := 20; … insert into emp values employe; 6
7
Opérateurs Arithmétique +, -, *, /, ** Concaténation ||
Parenthèse pour contrôler les priorités des opérations (, ) Affectation := Comparaison =, <>, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN Logique AND, OR, NOT Conversion de types 7
8
Conversions de types de données
Les mélanges de types provoquent des erreurs affectent les performances Fonctions de conversion : TO_CHAR TO_DATE TO_NUMBER Exemple : V := USER || ‘: ’ || DATE ; -- Types incompatibles V := USER || ‘: ’ || TO_CHAR(SYSDATE) ; -- ok 8
9
Blocks imbriqués et portée des variables (Exemple)
DECLARE poids_v NUMBER(3) := 600 ; message_v VARCHAR2(255) := ‘Produit 10012’ ; BEGIN DECLARE poids_v NUMBER(3) := 1 ; message_v VARCHAR2(255) := ‘Produit 11001’ ; pays_v VARCHAR2(50) := ‘Europe’ ; poids_v := poids_v +1 ; pays_v := ‘Ouest- ’ || pays_v ; END ; message_v := mesage_v || ‘ est en stock’ ; 9
10
Blocks imbriqués et portée des variables
DECLARE variable1_v NUMBER(3) := 10 ; BEGIN variable2_v NUMBER(3) := 10 ; END; variable1_v variable1_v variable2_v variable1_v 10
11
Blocks imbriqués et portée des variables
DECLARE variable1_v NUMBER(3) := 10 ; BEGIN variable1_v NUMBER(3) := 200 ; END; variable1_v (10) variable1_v (200) variable1_v (10) 11
12
Blocks imbriqués et portée des variables
DECLARE poids_v NUMBER(3) := 600 ; message_v VARCHAR2(255) := ‘Produit 10012’ ; BEGIN DECLARE poids_v NUMBER(3) := 1 ; -- (poids_v =1) message_v VARCHAR2(255) := ‘Produit 11001’ ; pays_v VARCHAR2(50) := ‘Europe’ ; poids_v := poids_v +1 ; -- (poids_v = 2) pays_v := ‘Ouest- ’ || pays_v ; END ; poids_v := poids_v +1 ; (poids_v = 601) message_v := mesage_v || ‘ est en stock’ ; -- (message_v = ‘Produit est en stock’) pays_v := ‘Ouest- ’ || pays_v ; -- ILLEGAL 12
13
Exercices 13
14
Structures de contrôle
Branchements conditionnels IF - THEN - END IF IF - THEN - ELSE - END IF IF - THEN - ELSIF - END IF Boucles LOOP - END LOOP FOR - END LOOP WHILE - END LOOP Note : la commande EXIT permet de sortir de tout type de boucle Exit when : permet de sortir de la boucle selon une condition 14
15
Structures de contrôle - branchements conditionnels
Syntaxe : IF <condition> THEN commandes ; [ELSIF <condition> THEN commandes ; ]* [ELSE commandes ; ] END IF ; Note : vous pouvez utiliser l’expression IS NULL dans les conditions Exemples : IF nomEmploye_v = ‘TOTO’ THEN salaire_v := salaire_v * 2 ; END IF; 15
16
Structures de contrôle - branchements conditionnels
IF nomEmploye_v = ‘TOTO’ THEN salaire_v := salaire_v * 2 ; ELSE salaire_v := salaire_v * 3 ; END IF; ELSIF salaire_v > THEN salaire_v := salaire_v / 2 ; 16
17
Exercices 1- Ecrire un programme pl/sql qui calcule la somme, le produit de deux variables. 2- Ecrire un code pl/Sql qui permet de tester le signe d’une variable A ( s’elle est positive elle reçoive -1 sinon elle reçoive +1). 3- Ecrire un code pl/sql qui donne une appréciation sur une note s’elle est <10 le programme donne a une variable de chaine de caractères la valeur ‘mal’ s’elle est > a 10 et <12 il lui donne la valeur ‘assez bien’ sinon ‘Bien’ 17
18
Structures de contrôle - boucles LOOP
Note : Sans commande EXIT, les boucles LOOP sont infinies Syntaxe : LOOP commandes ; EXIT [WHEN <condition>] ; END LOOP ; 18
19
Structures de contrôle - boucles LOOP
Exemple : DECLARE noEmp_v NUMBER (3) := 1; BEGIN LOOP INSERT INTO Employe (noEmp, nomEmp, job, noDept) VALUES (noEmp_v, ‘Oracle’, ‘PROGRAMMEUR’, 10) ; noEmp_v := noEmp_v +1 ; EXIT WHEN noEmp > 100 ; END LOOP ; END ; 19
20
Structures de contrôle - boucles FOR
Syntaxe : FOR <compteur> IN <limite_inf> .. <limite_sup> commandes ; END LOOP Exemple : DECLARE noEmp NUMBER (3); BEGIN FOR noEmp IN INSERT INTO Employe (noEmp, nomEmp, job, noDept) VALUES (noEmp, ‘Oracle’, ‘PROGRAMMEUR’, 10) ; END LOOP ; END ; 20
21
Structures de contrôle - boucles WHILE
Syntaxe : WHILE <condition> LOOP commandes ; END LOOP ; Exemple : DECLARE noEmp_v NUMBER (3); BEGIN noEmp_v := 1; WHILE noEmp_v <= 100 LOOP INSERT INTO Employe (noEmp, nomEmp, job, noDept) VALUES (noEmp_v, ‘Oracle’, ‘PROGRAMMEUR’, 10) ; noEmp_v := noEmp_v +1 ; END LOOP ; END ; 21
22
Structures de contrôles - remarques sur les boucles
Ne pas modifier le compteur d’une boucle FOR Les boucles peuvent être imbriquées On peut nommer les boucles pour identifier explicitement laquelle de deux boucles imbriquées se termine <<boucleExterne>> LOOP EXIT WHEN compteur_v = 10 ; <<boucleInterne>> LOOP EXIT boucleExterne WHEN compteur_v = 100 ; EXIT boucleInterne WHEN drapeau_v = TRUE ; END LOOP boucleInterne ; END LOOP boucleExterne ; . . . 22
23
Interactions avec le serveur Oracle
Inclure une requête SELECT dans un block PL/SQL Déclarer dynamiquement des variables de type adapté au SELECT Modifier des données dans PL/SQL Contrôler les transactions dans PL/SQL Déterminer le résultat d’une requête SELECT dans PL/SQL 23
24
Inclure une requête SELECT dans PL/SQL
DECLARE noDept_v NUMBER(2) ; lieu_v VARCHAR2(15) ; BEGIN SELECT noDept, lieu INTO noDept_v, lieu_v FROM Departement WHERE nomDept = ‘VENTES’ ; . . . END ; ATTENTION : la requête ne doit retourner que un et un seul tuple !!! Si ce n’est pas le cas, les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont levées 24
25
Déclarer dynamiquement des variables de type adapté au SELECT
%TYPE identifie dynamiquement le type d’un attribut d’une table %ROWTYPE identifie dynamiquement le type (structuré) d’un tuple d’une table DECLARE dateCommande_v Commande.dateCommande%TYPE ; uneCommande_v Commande%ROWTYPE ; . . . 25
26
Exemple : requête SELECT dans PL/SQL
DECLARE noDept_v Departement.noDept%TYPE; lieu_v Departement.lieu%TYPE; BEGIN SELECT noDept, lieu INTO noDept_v, lieu_v FROM Departement WHERE nomDept = ‘VENTES’ ; . . . END ; 26
27
Exemple : requête SELECT dans PL/SQL
DECLARE sommeSalaires_v Employe.salaire%TYPE ; noDept_v NUMBER NOT NULL := 10 ; BEGIN SELECT SUM(salaire) INTO sommeSalaires_v FROM Employe WHERE noDepartement = noDept_v ; END ; 27
28
Modifier des données dans PL/SQL
Trois commandes du langage de manipulation de données (LMD) de SQL permettent de modifier une base de données : INSERT UPDATE DELETE 28
29
Modifier des données dans PL/SQL (INSERT)
BEGIN INSERT INTO Employe (noEmp, nomEmp, job, noDept) VALUES (10, ‘Oracle’, ‘PROGRAMMEUR’, 10) ; END ; Note : on peut évidemment utiliser des variables au lieu de simples valeurs prédéfinies. 29
30
Modifier des données dans PL/SQL (UPDATE)
DECLARE majorationSalaire_v Employe.salaire%TYPE := 2000; BEGIN UPDATE Employe SET salaire = salaire + majorationSalaire_v WHERE job = ‘PROGRAMMEUR’ ; END ; Note : contrairement aux affectations PL/SQL, la clause update utilise le signe ‘=‘ comme opérateur d’affectation si une variable a le même nom qu’un nom d’attribut de la table manipulée dans la clause WHERE, le serveur Oracle utilise en priorité l’attribut de table 30
31
Modifier des données dans PL/SQL (DELETE)
DECLARE noDept_v Employe.noDept%TYPE := 10 ; BEGIN DELETE FROM Employe WHERE noDept = noDept_v ; END ; 31
32
Contrôler les transactions dans PL/SQL
La première commande INSERT/UPDATE/DELETE/CREATE/DROP d’un block entamme une nouvelle transaction La fin du block ne termine pas la transaction Pour terminer explicitement une transaction, utiliser les commandes SQL : COMMIT => valide les modifications faites depuis le début de la transaction en cours, et entamme une nouvelle transaction ROLLBACK => annule toutes les modifications faites depuis le début de la transaction en cours , et entamme une nouvelle transaction Note : Une transaction doit être un ensemble homogène de manipulations de la base de données => il faut réflechir à tous les endroits où il est légitime de mettre un COMMIT 32
33
Contrôler les transactions dans PL/SQL
DECLARE noDept_v Employe.noDept%TYPE := 10 ; majorationSalaire_v Employe.salaire%TYPE := 2000; BEGIN DELETE FROM Employe WHERE noDept = noDept_v ; COMMIT ; UPDATE Employe SET salaire = salaire + majorationSalaire_v WHERE job = ‘PROGRAMMEUR’ ; END ; 33
34
Affichage des données Option :
set serveroutput on : cette option permet d’activer l’affichage des données dans l’outil sql*plus Pour afficher un message ou une variable : DBMS_OUTPUT.PUT_LINE(‘message’); 34
35
Gestion des exceptions traitement des erreurs
35
36
Gestion des exceptions
36
37
Gestion des exceptions: Exemple
37
38
Gestion des curseurs Nécessite l’utilisation de curseurs
Les curseurs sont des zones de travail privées; ce sont des zones mémoire utilisées pour analyser et interpréter tout ordre SQL. Deux types de curseurs : les curseurs implicites Le serveur Oracle utilise des curseurs implicites pour exécuter les requêtes SQL les curseurs explicites sont des variables explicitement déclarées par le programmeur 38
39
Gestion des curseurs Attributs des curseurs: en utilisant les attributs de curseurs, vous pouvez tester le résultat de vos requêtes SQL SQL%ROWCOUNT nombre de tuples affectés par la dernière requête SQL (entier) SQL%FOUND booléen, vaut TRUE si la dernière requête SQL a affecté plus d’un tuple SQL%NOTFOUND booléen, vaut TRUE si la dernière requête SQL n’a affecté aucun tuple SQL%ISOPEN booléen indiquant si le curseur est ouvert ou fermé (par défaut ,les curseurs implicites sont toujours fermés à la fin de la requête) Note : à la place de ‘SQL’, utilisez le nom de votre curseur pour identifier l’état d’un curseur explicite 39
40
Gestion des curseurs Gestion explicites des curseurs :
Déclaration : dans la section DECLARE CURSOR nom_curseur IS ordre_select; Ouverture : dans la section BEGIN .. END OPEN nom_curseur; Assignation des valeurs d'une ligne aux variables réceptrices ou à la structure (souvent dans une boucle) FETCH nom_curseur INTO liste_variables /structure; Fermeture et libération de la place mémoire: CLOSE nom_curseur; 40
41
Gestion des curseurs DECLARE CURSOR departementVentes_v IS SELECT *
FROM Departement WHERE nomDept = ‘VENTES’ ; unDepartement_v Departement%ROWTYPE ; compteur_v number := 0 ; BEGIN OPEN departementVentes_v ; LOOP FETCH departementVentes_v INTO unDepartement_v ; EXIT WHEN departementVentes_v%NOTFOUND ; compteur_v := compteur_v +1 ; END LOOP ; CLOSE departementVentes_v ; END; 41
42
Exercice 42
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.