Download - Programmation d’application
Programmation d’application
INT
Bases de Données 2
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 3
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 4
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
Programmer avec une BD
Bases de Données 5
Interfaces SQL LPG
Solutions : Embedded SQL dans un L3G SQL/CLI PSM (Persistent Stored Modules)
Programmer avec une BD
Bases de Données 6
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
Bases de Données 7
Embedded SQLProgramme source (C+SQL)
Précompilation
Programme source Requêtes BD
sans cde SQL
compilation Traitement
code objet LibrairiesPlan d'exécution
Linkage Stockage
programme exécutable BD
Programmer avec une BD
DD
Bases de Données 8
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
Bases de Données 9
Ordre SQLOrdre SQL
Ordre SQLOrdre 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 SELECTEND
Serveur SQL BD
Bases de Données 10
Architecture client/serveur
SQL/CLI et Embedded SQL Procédure anonyme
Procédure stockée
ClientServeur SQL BD
Moteur PL/SQLPL/SQL
ClientServeur SQL BD
Moteur PL/SQL
RPC
Proc stockéePL/SQL
Bases de Données 11
Architecture client/serveur
Triggers
ClientServeur SQL BD
Moteur PL/SQL
Proc stockéePL/SQL
SQL UPDATE
delete INSERT
Bases de Données 12
Interfaces SQL LPGProgrammer avec une BD
Approche Java Autres langages
Embedded SQL SQLJ Pro*C
SQL/CLI JDBC ODBC
PSM PL/SQL
Bases de Données 13
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
Bases de Données 14
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 15
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 16
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 17
2-tiers JDBCApplet Java
Navigateur HTML
JDBC
SGBD
Protocole propriétaire SGBD
Machine clientIHM
JDBC
Machine serveur BDOracle
Bases de Données 18
3-tiers JDBCApplet Java
Navigateur HTML
Serveur d’application
JDBC
SGBD
HTTP, RMI, appels IIOP - CORBA
Protocole propriétaire SGBD
Machine clientIHM
Machine serveurBusiness Logic
Machine serveur BDOracle
Bases de Données 19
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 »
PL/SQL
Bases de Données 21
Plan du document
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
Bases de Données 22
Option procédurale d’Oracle
Extension de SQL Programming Language SQL
Procédure stockées Procédures Fonctions
Packages Triggers
Bases de Données 23
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 24
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 25
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 26
Bloc avec curseur explicite
DECLARECURSOR c IS
SELECT * FROM produits WHERE qte = 0;p produits%ROWTYPE;
BEGINOPEN 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 27
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 28
C + SQL avec PL/SQL
#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;
}
Bases de Données 29
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 30
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 31
Fonction PL/SQLCREATE 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 32
Gestion des erreursCREATE PROCEDURE Augmenter (noEmp INTEGER, augmentation REAL) IS
salaire REAL;salaire_manquant EXCEPTION;
BEGINSELECT salINTO salaireFROM employesWHERE num= noEmp;IF salaire IS NULL THEN
RAISE salaire_manquantelse
UPDATE employesSET sal = salaire + augmentationWHERE num = noEmp;
END if;Exception
WHEN NO_DATA_FOUND THENINSERT INTO resu VALUES (noEmp, ‘inexistant’);
WHEN salaire_manquant THENINSERT INTO resu VALUES (noEmp, ‘sans salaire’);
END Augmenter;
Bases de Données 33
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 34
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 35
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 36
Appel d’une fonction/procédure
Outil sql*plusExecute employe.Augmenter(10, 300);
Dans une fonction ou une procédure :Employe.augmenter(10, 300);RuptureStockProduit(p)
Dans une requête SQLSELECT *FROM departement dWHERE 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 37
TriggerCREATE trigger verifier_salaire IS
BEFORE INSERT or UPDATE OF sal, poste ON employesFOR each row WHEN new.job != ‘PDG’)
DECLAREminsal NUMBER;maxsal NUMBER;
BEGINSELECT min(sal), max(sal) INTO minsal, maxsalFROM employesWHERE 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;