La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire.

Présentations similaires


Présentation au sujet: "1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire."— Transcription de la présentation:

1 1 PL/SQL Noreddine GHERABI

2 2 Introduction 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

3 3 Structure dun programme Un programme est structuré en blocs dinstructions 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;

4 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

5 5 Variables Déclaration dune 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 quune variable est du même type quune colonne dune table (ou quune autre variable) : NC client.nom.%TYPE; Age number; Age1 age%type;

6 6 Variables Une variable peut contenir toutes les colonnes dune ligne dune table employe emp%ROWTYPE; déclare que la variable employe contiendra une ligne de la table emp Exemple dutilisation employe emp%ROWTYPE; nom emp.nome%TYPE; select * INTO employe from emp where matr = 900; nom := employe.nome; employe.dept := 20; … insert into emp values employe;

7 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

8 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

9 9 Blocks imbriqués et portée des variables (Exemple) DECLARE poids_v NUMBER(3) := 600 ; message_v VARCHAR2(255) := Produit ; BEGIN DECLARE poids_v NUMBER(3) := 1 ; message_v VARCHAR2(255) := Produit ; pays_v VARCHAR2(50) := Europe ; BEGIN poids_v := poids_v +1 ; pays_v := Ouest- || pays_v ; END ; poids_v := poids_v +1 ; message_v := mesage_v || est en stock ; pays_v := Ouest- || pays_v ; END ;

10 10 Blocks imbriqués et portée des variables DECLARE variable1_v NUMBER(3) := 10 ; BEGIN DECLARE variable2_v NUMBER(3) := 10 ; BEGIN END; variable1_v variable2_v variable1_v

11 11 Blocks imbriqués et portée des variables DECLARE variable1_v NUMBER(3) := 10 ; BEGIN DECLARE variable1_v NUMBER(3) := 200 ; BEGIN END; variable1_v (10) variable1_v (200) variable1_v (10)

12 12 Blocks imbriqués et portée des variables DECLARE poids_v NUMBER(3) := 600 ; message_v VARCHAR2(255) := Produit ; BEGIN DECLARE poids_v NUMBER(3) := 1 ;-- (poids_v =1) message_v VARCHAR2(255) := Produit ; pays_v VARCHAR2(50) := Europe ; BEGIN 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 END ;

13 13 Exercices

14 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

15 15 Structures de contrôle - branchements conditionnels Syntaxe : IF THEN commandes ; [ELSIF THEN commandes ; ]* [ELSE commandes ; ] END IF ; Note : vous pouvez utiliser lexpression IS NULL dans les conditions Exemples : IF nomEmploye_v = TOTO THEN salaire_v := salaire_v * 2 ; END IF;

16 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; IF nomEmploye_v = TOTO THEN salaire_v := salaire_v * 2 ; ELSIF salaire_v > THEN salaire_v := salaire_v / 2 ; ELSE salaire_v := salaire_v * 3 ; END IF;

17 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 dune variable A ( selle 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 selle est a 10 et <12 il lui donne la valeur assez bien sinon Bien

18 18 Structures de contrôle - boucles LOOP Note : Sans commande EXIT, les boucles LOOP sont infinies Syntaxe : LOOP commandes ;... EXIT [WHEN ] ; END LOOP ;

19 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 ;

20 20 Structures de contrôle - boucles FOR Syntaxe : FOR IN.. 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 ;

21 21 Structures de contrôle - boucles WHILE Syntaxe : WHILE 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 ;

22 22 Structures de contrôles - remarques sur les boucles Ne pas modifier le compteur dune boucle FOR Les boucles peuvent être imbriquées On peut nommer les boucles pour identifier explicitement laquelle de deux boucles imbriquées se termine... > LOOP... EXIT WHEN compteur_v = 10 ; > LOOP EXIT boucleExterne WHEN compteur_v = 100 ; EXIT boucleInterne WHEN drapeau_v = TRUE ; END LOOP boucleInterne ; END LOOP boucleExterne ;...

23 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 dune requête SELECT dans PL/SQL

24 24 Inclure une requête SELECT dans PL/SQL DECLARE noDept_v NUMBER(2) ; lieu_v VARCHAR2(15) ; BEGIN SELECTnoDept, lieu INTOnoDept_v, lieu_v FROMDepartement WHEREnomDept = VENTES ;... END ; ATTENTION : la requête ne doit retourner que un et un seul tuple !!! Si ce nest pas le cas, les exceptions NO_DATA_FOUND ou TOO_MANY_ROWS sont levées

25 25 Déclarer dynamiquement des variables de type adapté au SELECT %TYPE identifie dynamiquement le type dun attribut dune table %ROWTYPE identifie dynamiquement le type (structuré) dun tuple dune table DECLARE dateCommande_v Commande.dateCommande%TYPE ; uneCommande_v Commande%ROWTYPE ;...

26 26 Exemple : requête SELECT dans PL/SQL DECLARE noDept_v Departement.noDept%TYPE; lieu_v Departement.lieu%TYPE; BEGIN SELECTnoDept, lieu INTOnoDept_v, lieu_v FROMDepartement WHEREnomDept = VENTES ;... END ;

27 27 Exemple : requête SELECT dans PL/SQL DECLARE sommeSalaires_v Employe.salaire%TYPE ; noDept_v NUMBER NOT NULL := 10 ; BEGIN SELECT SUM(salaire) INTOsommeSalaires_v FROMEmploye WHEREnoDepartement = noDept_v ; END ;

28 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

29 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.

30 30 Modifier des données dans PL/SQL (UPDATE) DECLARE majorationSalaire_v Employe.salaire%TYPE := 2000; BEGIN UPDATEEmploye SETsalaire = salaire + majorationSalaire_v WHEREjob = PROGRAMMEUR ; END ; Note : –contrairement aux affectations PL/SQL, la clause update utilise le signe = comme opérateur daffectation –si une variable a le même nom quun nom dattribut de la table manipulée dans la clause WHERE, le serveur Oracle utilise en priorité lattribut de table

31 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 ;

32 32 Contrôler les transactions dans PL/SQL La première commande INSERT/UPDATE/DELETE/CREATE/DROP dun 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

33 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 ; UPDATEEmploye SETsalaire = salaire + majorationSalaire_v WHEREjob = PROGRAMMEUR ; END ;

34 34 Affichage des données Option : set serveroutput on : cette option permet dactiver laffichage des données dans loutil sql*plus Pour afficher un message ou une variable : DBMS_OUTPUT.PUT_LINE(message);

35 35 Gestion des exceptions traitement des erreurs

36 36 Gestion des exceptions

37 37 Gestion des exceptions: Exemple

38 38 Gestion des curseurs Nécessite lutilisation 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

39 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 dun tuple SQL%NOTFOUND booléen, vaut TRUE si la dernière requête SQL na 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 dun curseur explicite

40 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;

41 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;

42 42 Exercice


Télécharger ppt "1 PL/SQL Noreddine GHERABI. 2 Introduction Pourquoi PL/SQL ? SQL est un langage non procédural. Les traitements complexes sont parfois difficiles à écrire."

Présentations similaires


Annonces Google