Plsql2

637 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
637
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Plsql2

  1. 1. (   LABORATOIRE D’INFORMATIQUE DE L’UNIVERSITE DE PAU ET DES PAYS DE L’ADOUR BDD Avancées Fonctions et Procédures Richard Chbeir, Ph.D.
  2. 2. Plan   Introduction   Procédure Fonction 10/12/13 Page 2 Package
  3. 3. Introduction •  Ces objets sont stockés une seule fois dans la base •  Ils sont partageables et gérées par plusieurs applications de façon centralisée •  Ils sont soumis à tous les mécanismes de sécurité et de confidentialité 10/12/13 Page 3
  4. 4. Introduction •  Pour créer un objet procédural, il faut posséder les privilèges –  CREATE PROCEDURE (création locale) –  CREATE ANY PROCEDURE (création dans d'autres schémas) 10/12/13 Page 4
  5. 5. Introduction •  Pour exécuter un objet procédural, il faut posséder les privilèges –  EXECUTE PROCEDURE (exécution locale) –  EXECUTE ANY PROCEDURE (exécution dans d'autres schémas) •  Pour donner à un autre utilisateur le droit d'exécution –  GRANT EXECUTE ON ma_procédure TO autre_utilisateur 10/12/13 Page 5
  6. 6. Procédure •  Est un bloc PL/SQL nommé pouvant contenir –  –  –  –  –  •  •  •  •  Des commandes SQL (LMD) Des instructions PL/SQL Des variables et des constantes Des curseurs Un gestionnaire d'erreurs Peut être paramétrée et exécutée Utilisée pour réaliser une (ou plusieurs) action(s) Peut être récursif et surchargé Est compilé avant le stockage –  Ne nécessite plus d'analyse ni de compilation à l'exécution –  Sa mise en mémoire permettra d'améliorer les performances 10/12/13 Page 6
  7. 7. Procédure •  Concernant la sécurité –  On peut autoriser l'accès à certaines tables uniquement à travers des procédures sans avoir des droits d'accès aux tables en dehors des procédures 10/12/13 Page 7
  8. 8. Procédure •  Concernant l'intégrité –  Les procédures assurent la même fonctionnalité indépendamment de la partie appelante –  La recompilation d'une procédure en cas de modification n'exige pas la recompilation de l'ensemble du code de l'application 10/12/13 Page 8
  9. 9. Procédure •  Concernant les performances –  Réduction du trafic sur le réseau par la soumission d'un bloc PL/SQL au lieu de plusieurs commandes SQL –  Compilation des procédures cataloguées (le moteur ne recompile pas les procédures au moment de l'exécution –  Exécution immédiate de la procédure si elle est dans la SGA (pas d'accès disque) –  Partage de l'exécution d'une procédure par plusieurs utilisateurs (notion de mémoire partagée) 10/12/13 Page 9
  10. 10. Procédure •  Structure générale PROCEDURE nom_procédure [(paramètres, …)] {IS | AS} Déclaration des variables locales BEGIN Instructions SQL et PL/SQL EXCEPTION Traitement des exceptions END [nom_procédure]; 10/12/13 Page 10
  11. 11. Procédure •  Création CREATE [OR REPLACE] PROCEDURE [schéma.]nom_procédure [(paramètres, …)] {IS | AS} Déclaration des variables locales BEGIN Instructions SQL et PL/SQL EXCEPTION Traitement des exceptions END [nom_procédure]; Nomparametre [ IN | OUT | IN OUT] type [{:=default}] 10/12/13 Page 11 IN: variable passée en entrée (Par défaut) OUT : variable renseignée par la procédure puis envoyée à l'appelant IN OUT : passage par référence Le type ne doit pas contenir d'indication sur sa taille
  12. 12. Procédure •  Exemple : Augmentation de salaire 10/12/13 Page 12 CREATE OR REPLACE PROCEDURE Augmentation_salaire (NumSal integer, Montant Real) IS SalaireActuel Real; SalaireNull Exception; BEGIN SELECT sal into SalaireActuel FROM emp where empno = NumSal; IF (SalaireActuel IS NULL) THEN RAISE SalaireNull; ELSE UPDATE emp set sal = sal + Montant Where empno = NumSal; END IF; EXCEPTION WHEN no_data_found THEN dbms_output.put_line(NumSal || 'Est inconnu'); WHEN SalaireNull THEN dbms_output.put_line(NumSal || 'a un Salaire Null'); END Augmentation_Salaire; /
  13. 13. Procédure •  Exécution de la procédure AugmentationSalaire BEGIN A partir d'une autre procédure … AugmentationSalaire (100, 1000); … A partir de SQL*Plus 10/12/13 Page 13 SQL> EXECUTE AugmentationSalaire (100, 1000);
  14. 14. Procédure •  Mais PL/SQL exige la déclaration d'une procédure avant de l'utiliser DECLARE PROCEDURE AccorderAugmentation (. . .) IS BEGIN AugmentationSalaire (. . .); -- non déclarée END; PROCEDURE AugmentationSalaire (. . .) IS BEGIN ... END; ... 10/12/13 Page 14
  15. 15. Procédure •  Mais PL/SQL exige la déclaration d'une procédure avant de l'utiliser Solution 1 DECLARE PROCEDURE AugmentationSalaire (. . .) IS BEGIN ... END; PROCEDURE AccorderAugmentation (. . .) IS BEGIN AugmentationSalaire (. . .); -- déjà déclarée END; ... 10/12/13 Page 15
  16. 16. Procédure •  Mais PL/SQL exige la déclaration d'une procédure avant de l'utiliser Solution 2 DECLARE PROCEDURE AugmentationSalaire (…); --forward declaration PROCEDURE AccorderAugmentation (. . .) IS BEGIN AugmentationSalaire (. . .); -- déjà déclarée END; PROCEDURE AugmentationSalaire (. . .) IS BEGIN ... END; ... 10/12/13 Page 16
  17. 17. Procédure •  Surcharge ou overloading –  Possible dans un bloc ou un package –  Pas possible si seulement les noms des paramètres ou leur mode de passage sont différents DECLARE …. PROCEDURE Augmentation_salaire (NumSal integer, Montant Real) IS … END Augmentation_Salaire; PROCEDURE Augmentation_salaire (Montant Real) IS … END Augmentation_Salaire; / 10/12/13 Page 17
  18. 18. Procédure •  Modification d'une procédure –  Après n'importe quelle modification dans une procédure, on est obligé de recompiler avec SQL> ALTER PROCEDURE [Schéma.]nom_procédure COMPILE; •  Exemple SQL> ALTER PROCEDURE AugmentationSalaire COMPILE; 10/12/13 Page 18
  19. 19. Procédure •  Suppression d'une procédure SQL> DROP PROCEDURE [Schéma.]nom_procédure; 10/12/13 Page 19
  20. 20. Procédure •  Exemple CREATE PROCEDURE suppression_Salarié (num_emp number) AS BEGIN DELETE FROM emp WHER empno = num_emp; END / Quelles sont les erreurs identifiées ? SQL> SHOW ERRORS ERRO…. 10/12/13 Page 20
  21. 21. Procédure •  Exemple CREATE PROCEDURE suppression_Salarié (num_emp number) AS BEGIN DELETE FROM emp WHER empno = num_emp; END / Quelles sont les erreurs identifiées ? –  On peut également interroger •  USER_ERRORS, ALL_ERRORS, DBA_ERRORS 10/12/13 Page 21
  22. 22. Procédure •  Les sources de vos procédures sont stockées dans –  USER_SOURCE –  ALL_SOURCE –  DBA_SOURCE 10/12/13 Page 22
  23. 23. Procédure externe •  A partir de la version 8i, on peut intégrer des procédures écrites dans d'autres langages (Java, C, Pascal, etc.) 10/12/13 Page 23
  24. 24. Fonction •  Est une procédure qui renvoie une valeur •  Possède dans sa structure la clause supplémentaire RETURN •  Peut être utilisée dans les requêtes SQL FUNCTION nom_fonction [(paramètres, …)] RETURN type {IS | AS} Déclaration des variables locales BEGIN Instructions SQL et PL/SQL RETURN (valeur); EXCEPTION Traitement des exceptions END [nom_fonction]; 10/12/13 Page 24 Nomparamètre [IN] type [, nomparamètre2 [IN] type … Où type ne doit pas contenir d'indication sur la taille
  25. 25. Fonction •  Création d'une fonction stockée CREATE [OR REPLACE] FUNCTION [schéma.]nom_fonction [(paramètres, …)] RETURN type {IS | AS} Déclaration des variables locales BEGIN Instructions SQL et PL/SQL RETURN (Valeur); EXCEPTION Traitement des exceptions END [nom_fonction]; 10/12/13 Page 25
  26. 26. Fonction •  Exemple d'une fonction VérificationSalaire CREATE or replace FUNCTION VérificationSalaire (NumGrade integer, Montant Real) RETURN boolean AS MinSalaire Real; MaxSalaire Real; BEGIN SELECT losal, hisal INTO MinSalaire, MaxSalaire FROM salgrade WHERE grade = NumGrade; RETURN ((Montant >= MinSalaire) AND (Montant <= MaxSalaire)); END VérificationSalaire; / 10/12/13 Page 26
  27. 27. Fonction •  Exécution de la fonction VérificationSalaire A partir d'une autre procédure A partir de SQL*Plus 10/12/13 Page 27 BEGIN … IF VérificationSalaire (100, 1000) THEN … SQL> select VérificationSalaire (100, 1000) FROM Dual;
  28. 28. Fonction •  Suppression d'une fonction SQL> DROP FUNCTION [Schéma.]nom_fonction; 10/12/13 Page 28
  29. 29. Fonction •  Surcharge ou overloading –  Pas possible si seul le type retourné est différent 10/12/13 Page 29
  30. 30. Package •  Permet d'encapsuler dans une unité de la BDD plusieurs –  Procédures, fonctions, curseurs et variables •  Ne peut pas être appelé, paramétré, ou imbriqué •  Apporte plusieurs avantages –  Meilleure gestion de privilèges –  Meilleur moyen de structuration et de d'organisation –  Meilleures performances •  Le moteur charge au noyau le package entier 10/12/13 Page 30
  31. 31. Package •  Se compose de deux parties Spécification Application Corps 10/12/13 Page 31 BDD Oracle
  32. 32. Package •  Création d'un Package –  Création des spécifications •  Consiste à déclarer les procédures, fonctions, constates, variables, et les exceptions accessibles par le public autorisé –  Création du corps •  Consiste à définir les procédures, fonctions, constates, variables, et les exceptions déclarées dans la section spécifications du package •  Peut contenir également d'autres objets (privés) non déclarés dans la spécification qui seront inaccessibles en dehors du corps du package •  Toute l'implémentation est cachée aux applications 10/12/13 Page 32
  33. 33. Package •  Création d'un Package –  Création de la section spécification CREATE [OR REPLACE] PACKAGE [Schéma.]nom_package {IS |AS} Déclatation des variables globales Interface des sous-programmes END [nom_package]; 10/12/13 Page 33
  34. 34. Package •  Création d'un Package –  Création du corps CREATE [OR REPLACE] PACKAGE BODY [Schéma.]nom_package {IS |AS} Déclaration des variables locales corps des sous-programmes publics et privés BEGIN …. END [nom_package]; 10/12/13 Page 34
  35. 35. Package •  Exemple CREATE OR REPLACE PACKAGE Gestion_Salarié IS FUNCTION Embaucher (nom VARCHAR2, fonction VARCHAR2, Chef NUMBER, eentrée DATE, salaire NUMBER, commission NUMBER, NuméroDept NUMBER) RETURN NUMBER; PROCEDURE Suppression_Salarié (NuméroSalarié NUMBER); PROCEDURE Augmentation_Salaire (NumSal NUMBER, Montant REAL); END Gestion_Salarié ; 10/12/13 Page 35
  36. 36. Package •  Exemple CREATE OR REPLACE PACKAGE BODY Gestion_Salarié IS FUNCTION Embaucher (nom VARCHAR2, fonction VARCHAR2, Chef NUMBER, dateentrée DATE, salaire NUMBER, commission NUMBER, NuméroDept NUMBER) RETURN NUMBER IS Nouveau NUMBER(8); BEGIN SELECT MAX(empno)+1 INTO Nouveau FROM emp; INSERT INTO emp VALUES (Nouveau, nom, fonction, chef, dateentrée, salaire, commission, NuméroDept); RETURN (Nouveau); END Embaucher; PROCEDURE Suppression_Salarié (NuméroSalarié NUMBER); … END Suppression_Salarié; PROCEDURE Augmentation_Salaire (NumSal NUMBER, Montant REAL); … END Augmentation_Salaire; END Gestion_Salarié ; 10/12/13 Page 36
  37. 37. Package •  Appel d'une procédure ou fonction packagée A partir de SQL*Plus SQL> EXECUTE Nompackage.nom_procédure [(paramètre)]; A partir d'une autre procédure 10/12/13 Page 37 BEGIN … Nompackage.nomprocédure [(paramètres)]; …
  38. 38. Package •  Suppression d'un package SQL> DROP PACKAGE [Schéma.]nom_package; 10/12/13 Page 38
  39. 39. Merci ! 10/12/13 Page 39

×