370 likes | 478 Views
Programmation d’application. INT. Plan du document. Contexte slide 1 Programmer avec une BD slide 2 Client-Serveur SQL et architecture 3 rangs slide 13 JDBC slide 14 Serveurs d’applications et « portails » slide 19 PL/SQL slide 20. Contexte.
E N D
Plan du document • Contexte slide 1 • Programmer avec une BD slide 2 • Client-Serveur SQL et architecture 3 rangs slide 13 • JDBC slide 14 • Serveurs d’applications et « portails » slide 19 • PL/SQL slide 20 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 Bases de Données
Programmer avec une BD Programmer avec une BD • Générateurs d’application 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 Bases de Données
Programmer avec une BD Interfaces SQL LPG • Solutions : • Embedded SQL dans un L3G • SQL/CLI • PSM (Persistent Stored Modules) Bases de Données
Programmer avec une BD 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 ??? Bases de Données
Programme source (C+SQL) Précompilation Programme source Requêtes BD sans cde SQL compilation Traitement Plan d'exécution code objet Librairies Linkage Stockage programme exécutable BD Programmer avec une BD Embedded SQL DD Bases de Données
Programmer avec une BD 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 Bases de Données
Programmer avec une BD 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 BEGIN FOR i = 1 to 4 SELECT END Ordre SQL BD Ordre SQL Ordre SQL Client Serveur SQL Ordre SQL Bases de Données
Architecture client/serveur • SQL/CLI et Embedded SQL • Procédure anonyme • Procédure stockée BD Moteur PL/SQL Serveur SQL PL/SQL Client BD Moteur PL/SQL Serveur SQL RPC Client Proc stockée PL/SQL Bases de Données
Architecture client/serveur • Triggers SQL UPDATE delete INSERT BD Moteur PL/SQL Serveur SQL Client Proc stockée PL/SQL Bases de Données
Programmer avec une BD Interfaces SQL LPG Bases de Données
Client-Serveur SQL et architecture 3 rangs Site 1 Client léger : navigateur http • Terminal : navigateur • C/S HTTP • Frontal : Serveur + passerelle • C/S SQL • Dorsal : SGBD Middleware http Site 2 Serveur http Passerelle CGI SQL Middleware SQL Site 3 Serveur SQL 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 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 Bases de Données
Principes JDBC • Connexion (se lie à un SGBD particulier avec un nom d’utilISateur) • 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) Bases de Données
2-tiers JDBC Applet Java Navigateur HTML JDBC Machine client IHM JDBC Protocole propriétaire SGBD SGBD Machine serveur BD Oracle Bases de Données
3-tiers JDBC Applet Java Navigateur HTML Machine client IHM HTTP, RMI, appels IIOP - CORBA Serveur d’application JDBC Machine serveur Business Logic Protocole propriétaire SGBD SGBD Machine serveur BD Oracle Bases de Données
Serveurs d’applications 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 » Bases de Données
Introduction Option procédurale d’Oracle Objectifs Caractéristiques de PL/SQL Procédure anonyme PL/SQL par l’exemple 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 Plan du document Bases de Données
Option procédurale d’Oracle • Extension de SQL • Programming Language SQL • Procédure stockées • Procédures • Fonctions • Packages • Triggers 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é 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 d’E/S Bases de Données
Procédure anonyme • Syntaxe DECLARE déclaration des variables locales BEGIN suite d’instructions PL/SQL EXCEPTION suite d’instructions PLSQL END; RUN; exécution de la procédure 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; 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; Bases de Données
#include <stdio.h> 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 d’un nouvel employé EXEC SQL EXECUTE DECLARE -- var locales PL/SQL BEGIN INSERT INTO emp VALUES (:nom, …) Exception --TRT Exception END; END-EXEC; } C + SQL avec PL/SQL 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; 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; 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; 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; 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; 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 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 d’une procédure avec les droits d’accès de son créateur Bases de Données
Appel d’une 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 d’un bloc PL/SQL • Dans un outil de devt :Developper 2000 • Trigger 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 FROM employes WHERE poste = :new.poste; IF (:new.sal < minsal or :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; Bases de Données