Programmation dapplication INT
2 Bases de Données Plan du document Contexteslide 1 Programmer avec une BDslide 2 Client-Serveur SQL et architecture 3 rangs slide 13 JDBC slide 14 Serveurs dapplications et « portails » slide 19 PL/SQLslide 20
3 Bases de Données Contexte Limites du SQL interactif : absence de structure de contrôle absence de variable Pas de « calcul » sur les données Adopter un langage de type procédural SQL doit rester le seul langage d'accès aux données
4 Bases de Données Programmer avec une BD Générateurs dapplication sur BD : Interface au dessus LDD LMD But : productivité Programmation vISuelle (QBE, QBF, LV) L4G : –Maquettage décrans –Enchaînement des actions triggers –Scripts associés aux objets graphiques SQL + LPG (PL/SQL) AGL Programmer avec une BD
5 Bases de Données Interfaces SQL LPG Solutions : Embedded SQL dans un L3G SQL/CLI PSM (Persistent Stored Modules) Programmer avec une BD
6 Bases de Données Embedded SQL dans un L3G Précompilé, compilé Dépendant du SGBD cible Problèmes 2 systèmes de types, 2 styles de programmation « Impedance mismatch » == « dysfonctionnement » NUMBER(x)int?, long ? DECIMAL(x,y), NUMBER(x,y)float ?, double ? VARCHAR(x)char(x+1)?, String NULL ??? Programmer avec une BD
7 Bases de Données Embedded SQL Programme source (C+SQL) Précompilation Programme sourceRequêtes BD sans cde SQL compilationTraitement code objetLibrairies Plan d'exécution LinkageStockage programme exécutableBD Programmer avec une BD DD
8 Bases de Données SQL/CLI Bas niveau compilé uniquement syntaxe moins concISe Interface universelle SGBD SQL Indépendance / SGBD Imbrication « sans couture » du SQL dans langage hôte ODBC, JDBC Programmer avec une BD
9 Bases de Données Ordre SQL PSM Inconvénient des deux approches précédentes Impedance mismatch Code procédural du côté client coût réseau SQL « procédural » PL/SQL « Routines » SQL Triggers C/S 2ème génération Programmer avec une BD Client BEGIN FOR i = 1 to 4 SELECT END Serveur SQL BD
10 Bases de Données Architecture client/serveur SQL/CLI et Embedded SQL Procédure anonyme Procédure stockée Client Serveur SQL BD Moteur PL/SQL PL/SQL Client Serveur SQL BD Moteur PL/SQL RPC Proc stockée PL/SQL
11 Bases de Données Architecture client/serveur Triggers Client Serveur SQL BD Moteur PL/SQL Proc stockée PL/SQL SQL UPDATE delete INSERT
12 Bases de Données Interfaces SQL LPG Programmer avec une BD ApprocheJavaAutres langages Embedded SQLSQLJPro*C SQL/CLIJDBCODBC PSMPL/SQL
13 Bases de Données Client-Serveur SQL et architecture 3 rangs Terminal : navigateur C/S HTTP Frontal : Serveur + passerelle C/S SQL Dorsal : SGBD Client léger : navigateur http Serveur http Passerelle CGI SQL Serveur SQL Middleware http Middleware SQL Site 1 Site 2 Site 3
14 Bases de Données JDBC Reprise des idées de ODBC dans le monde Java Indépendance / SGBD cible Recours à des pilotes Code portable de bout en bout Pas forcément construit au dessus de ODBC Autres API peuvent être définies à partir de JDBC
15 Bases de Données Pilotes JDBC JDBC non supporté en natif par les SGBD du commerce Transformations des appels JDBC en appels natifs 4 catégories de pilotes en fonctions de : La présence ou non de pilote SGBD (non java) sur le client Protocole de communication entre le client Java et le serveur
16 Bases de Données Principes JDBC Connexion (se lie à un SGBD particulier avec un nom dutilISateur) Création de requête (statements) Exécution de requête (execute) Récupération des résultats (resultset et next()) Opérations transactionnelles (commit, abort)
17 Bases de Données 2-tiers JDBC Applet Java Navigateur HTML JDBC SGBD Protocole propriétaire SGBD Machine client IHM JDBC Machine serveur BD Oracle
18 Bases de Données 3-tiers JDBC Applet Java Navigateur HTML Serveur dapplication JDBC SGBD HTTP, RMI, appels IIOP - CORBA Protocole propriétaire SGBD Machine client IHM Machine serveur Business Logic Machine serveur BD Oracle
19 Bases de Données Serveurs dapplications et « portails » ReconnaISsant les utilisateurs : Multiplier les « cookies » Vues adaptatives construites au fur et à mesure des requêtes et parcours Intégrant de multiples applications « servlets » Intégrant de multiples sources de données « wrappers »
PL/SQL
21 Bases de Données Plan du document Introduction Option procédurale dOracle Objectifs Caractéristiques de PL/SQL Procédure anonyme PL/SQL par lexemple Curseur explicite Curseur « FOR » C+SQL avec PL/SQL Procédure PL/SQL Fonction PL/SQL Gestion des erreurs Package Manipulation des procédures Gestion des procédures Appel des procédures/fonctions Trigger
22 Bases de Données Option procédurale dOracle Extension de SQL Programming Language SQL Procédure stockées Procédures Fonctions Packages Triggers
23 Bases de Données Objectifs Partager le code applicatif niveau serveur Application cliente L3G (C, Java) Application cliente L4G (Developper 2000, …) Centraliser les règles de gestion Optimiser les performances Accroître la sécurité
24 Bases de Données Caractéristiques PL/SQL Types de données : BD + composites Structures de contrôle Modularité (bloc, procédure, fonction, package) Gestion des erreurs (exception) Interface BD intégrée (SQL, curseur) Calculs Volontairement décorrélé des pb dE/S
25 Bases de Données Procédure anonyme Syntaxe DECLAREdéclaration des variables locales BEGINsuite dinstructions PL/SQL EXCEPTIONsuite dinstructions PLSQL END; RUN;exécution de la procédure
26 Bases de Données Bloc avec curseur explicite DECLARE CURSOR c IS SELECT * FROM produits WHERE qte = 0; p produits%ROWTYPE; BEGIN OPEN c; LOOP FETCH c INTO p; EXIT WHEN c%NOTFOUND; INSERT INTO RupStock VALUES (SYSDATE, p.noprod); END LOOP; CLOSE c; COMMIT; END;
27 Bases de Données Bloc avec curseur « FOR » DECLARE CURSOR c IS SELECT * FROM produits WHERE qte = 0; BEGIN FOR p IN c LOOP INSERT INTO RupStock VALUES (SYSDATE, p.noprod); END LOOP; COMMIT; END;
28 Bases de Données C + SQL avec PL/SQL #include EXEC SQL BEGIN DECLARE SECTION VARCHAR nom[20]; VARCHAR piece[4]; int nodpt; VARCHAR status[50]; VARCHAR uid[20]; VARCHAR passwd[20]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE sqlca; main(){ /* lecture des caractéristiques dun nouvel employé EXEC SQL EXECUTE DECLARE -- var locales PL/SQL BEGIN INSERT INTO emp VALUES (:nom, …) Exception --TRT Exception END; END-EXEC; }
29 Bases de Données Procédure PL/SQL CREATE PROCEDURE RuptureStock IS CURSOR c IS SELECT * FROM produits; BEGIN FOR p IN c LOOP IF p.qte = 0 THEN INSERT INTO RupStock VALUES (SYSDATE, p.noprod); END IF; END LOOP; COMMIT; END RuptureStock;
30 Bases de Données Procédure PL/SQL CREATE PROCEDURE RuptureStockProduit (p Produits%ROWTYPE) IS BEGIN IF p.qte = 0 THEN INSERT INTO RupStock VALUES (SYSDATE, p.noprod); END IF; COMMIT; END RuptureStockProduit;
31 Bases de Données Fonction PL/SQL CREATE FUNCTION NbEmp (nodpt INTEGER) return INTEGER IS nb INTEGER; BEGIN SELECT count(e.noemp) INTO nb FROM employes e WHERE e.nodpt=nodpt; return (nb); END NbEmp;
32 Bases de Données Gestion des erreurs CREATE PROCEDURE Augmenter (noEmp INTEGER, augmentation REAL) IS salaire REAL; salaire_manquant EXCEPTION; BEGIN SELECT sal INTO salaire FROM employes WHERE num= noEmp; IF salaire IS NULL THEN RAISE salaire_manquant else UPDATE employes SET sal = salaire + augmentation WHERE num = noEmp; END if; Exception WHEN NO_DATA_FOUND THEN INSERT INTO resu VALUES (noEmp, inexistant); WHEN salaire_manquant THEN INSERT INTO resu VALUES (noEmp, sans salaire); END Augmenter;
33 Bases de Données Packages CREATE PACKAGE employe IS PROCEDURE Embaucher (nom VARCHAR2); PROCEDURE Augmenter(noEmp INTEGER, augmentation REAL); PROCEDURE Partir(noEmp INTEGER); END Employe; CREATE PACKAGE body employe IS PROCEDURE Embaucher (nom VARCHAR2) IS …. ; PROCEDURE Augmenter (noEmp INTEGER, augmentation REAL) IS …; PROCEDURE Partir(noEmp INTEGER) IS …; END employe;
34 Bases de Données Manipulation des procédures CREATE [PROCEDURE|FUNCTION|PACKAGE|PACKAGE BODY] Création + compilation CREATE or replace..; Modification + compilation Grant Grant execute on Augmenter to chefs; Drop [PROCEDURE|FUNCTION|PACKAGE|PACKAGE BODY] Suppression
35 Bases de Données Gestion des procédures Stockage des procédures dans le serveur Format source + Format compilé Optimisation des ordres SQL des procédures Gestion automatiques des dépendances entre les procédures et les autres objets de la BD Exécution dune procédure avec les droits daccès de son créateur
36 Bases de Données Appel dune fonction/procédure Outil sql*plus Execute employe.Augmenter(10, 300); Dans une fonction ou une procédure : Employe.augmenter(10, 300); RuptureStockProduit(p) Dans une requête SQL SELECT * FROM departement d WHERE NbEmp(d.nodpt) > 10 Dans un programme Embedded SQL À partir dun bloc PL/SQL Dans un outil de devt :Developper 2000 Trigger
37 Bases de Données Trigger CREATE trigger verifier_salaire IS BEFORE INSERT or UPDATE OF sal, poste ON employes FOR each row WHEN new.job != PDG) DECLARE minsal NUMBER; maxsal NUMBER; BEGIN SELECT min(sal), max(sal) INTO minsal, maxsal FROMemployes WHERE poste = :new.poste; IF (:new.sal maxsal) THEN RAISE en_dehors_borne; ELSIF (:new.sal < :old.sal) THEN RAISE augmentation_negative; ELSIF (:new.sal > 1.1 * :old.sal) THEN RAISE augmentation_importante; EXCEPTION … END;