1 Développement des Applications des Bases de Données Chapitre 6, Sections 6.3.6--6.5.

Slides:



Advertisements
Présentations similaires
Bratec Martin ..
Advertisements

NOTIFICATION ÉLECTRONIQUE
Fragilité : une notion fragile ?
SEMINAIRE DU 10 AVRIL 2010 programmation du futur Hôtel de Ville
Phono-sémantique différentielle des monosyllabes italiens
MAGGIO 1967 BOLOGNA - CERVIA ANOMALIES DU SOMMEIL CHEZ L'HOMME
droit + pub = ? vincent gautrais professeur agrégé – avocat
Transcription de la présentation:

1 Développement des Applications des Bases de Données Chapitre 6, Sections

2 Survol JDBC SQLJ Procédures stockées

3 JDBC: Examen des Metadonnées Les objets de la classe DatabaseMetaData donnent des informations au sujet du SGBD et du catalogue de la base de données. DatabaseMetaData md = con.getMetaData(); // imprime de linfo au sujet du driver: System.out.println( Name: + md.getDriverName() + version: + md.getDriverVersion());

4 JDBC: Examen des Metadonnées (Suite) Un objet de la classe DatabaseMetaData contient 134 méthodes!!! - getCatalog() - getIndexInfo() - getTables() - getMaxConnections() etc.

5 JDBC: Examen des Metadonnées (Suite) DatabaseMetaData md=con.getMetaData(); ResultSet trs=md.getTables(null,null,null,null); String tableName; While(trs.next()) { tableName = trs.getString(TABLE_NAME); System.out.println(Table: + tableName); //print all attributes ResultSet crs = md.getColumns(null,null,tableName, null); while (crs.next()) { System.out.println(crs.getString(COLUMN_NAME + ); }

6 Un Exemple (Semi-)Complet Connection con = // connecter DriverManager.getConnection(url, login", pass"); Statement stmt = con.createStatement(); String query = "SELECT name, rating FROM Sailors"; ResultSet rs = stmt.executeQuery(query); try { // handle exceptions // boucle parcourant les tuples du résultat while (rs.next()) { String s = rs.getString(name"); Int n = rs.getFloat(rating"); System.out.println(s + " " + n); } } catch(SQLException ex) { System.out.println(ex.getMessage () + ex.getSQLState () + ex.getErrorCode ()); }

7 SQLJ Complémente JDBC avec un modèle de requêtes (semi-)statiques: le compilateur peut faire une série de tâches: vérifier la syntaxe, les types des données, la conformité de la requête avec le schéma Exemple: #sql books = { SELECT name, rating INTO :name, :rating FROM Books WHERE sid = :sid }; Comparer avec ce qui se fait en JDBC: sid=rs.getInt(1); if (sid==1) {sname=rs.getString(2);} else { sname2=rs.getString(2);} SQLJ fait partie du standard SQL, contrairement au SQL imbriqué qui est spécifique à chaque vendeur.

8 Exemple de Code SQLJ Int sid; String name; Int rating; … // itérateur nominal #sql iterator Sailors(Int sid, String name, Int rating); Sailors sailors; // Supposez que lapplication a déjà fixé la valeur de rating #sailors = { SELECT sid, sname INTO :sid, :name FROM Sailors WHERE rating = :rating }; // puise les résultats while (sailors.next()) { System.out.println(sailors.sid + + sailors.sname)); } sailors.close();

9 Iterateurs SQLJ Deux type ditérateurs (curseurs): Itérateur nominal Mentionne le nom de la variable ainsi que son type et permet de puiser les valeurs des colonnes par les noms. Exemple: transparent précédent. Itérateur positionnel Mentionne seulement le type de la variable et utilise FETCH.. INTO pour puiser les valeurs des colonnes: #sql iterator Sailors(Int, String, Int); Sailors sailors; #sailors = … while (true) { #sql {FETCH :sailors INTO :sid, :name} ; if (sailors.endFetch()) { break; } // traiter les valeurs obtenues pour sid et sname }

10 Procédures Stockées Définition dune procédure stockée: Programme exécuté à travers une seule instruction SQL Exécutée dans lespace des processus du serveur Avantages: Peut encapsuler la logique de lapplication et en même temps être près de la source de données Réutilise la logique de lapplication par différents utilisateurs Retourne les données en évitant lutilisation des curseurs

11 Procédures Stockées: Exemples CREATE PROCEDURE ShowNumReservations SELECT S.sid, S.sname, COUNT(*) FROM Sailors S, Reserves R WHERE S.sid = R.sid GROUP BY S.sid, S.sname Les procédures stockées peuvent avoir des paramètres: Trois différents modes: IN, OUT, INOUT CREATE PROCEDURE IncreaseRating( IN sailor_sid INTEGER, IN increase INTEGER) UPDATE Sailors SET rating = rating + increase WHERE sid = sailor_sid

12 Procédures Stockées: Exemples (Suite) Les procédures stockées ne doivent pas nécessairement être écrites en SQL: CREATE PROCEDURE TopSailors( IN num INTEGER) LANGUAGE JAVA EXTERNAL NAME file:///c:/storedProcs/rank.jar

13 Exécution des Procédures Stockées EXEC SQL BEGIN DECLARE SECTION Int sid; Int rating; EXEC SQL END DECLARE SECTION // Exécution de la procédure stockée EXEC CALL IncreaseRating(:sid,:rating);

14 Exécution des Procédures Stockées (Suite) JDBC: CallableStatement cstmt= con.prepareCall({call ShowSailors}); ResultSet rs = cstmt.executeQuery(); while (rs.next()) { … } SQLJ: #sql iterator ShowSailors(…); ShowSailors showsailors; #sql showsailors={CALL ShowSailors}; while (showsailors.next()) { … }

15 SQL/PSM La plupart des SGBDs permettent aux utilisateurs de stocker des procédures en usant dun language simple et tout usage proche de SQL Le standard SQL/PSM est représentatif de tels langages. Déclaration dune procédure stockée: CREATE PROCEDURE name(p1, p2, …, pn) déclarations de variables locales code de la procédure; Declaration dune fonction: CREATE FUNCTION name (p1, …, pn) RETURNS Type de données se SQL déclarations de variables locales code de la fonction;

16 Principaux Éléments de SQL/PSM CREATE FUNCTION rate Sailor (IN sailorId INTEGER) RETURNS INTEGER DECLARE rating INTEGER DECLARE numRes INTEGER SET numRes = (SELECT COUNT(*) FROM Reserves R WHERE R.sid = sailorId) IF (numRes > 10) THEN rating =1; ELSE rating = 0; END IF; RETURN rating;

17 Principaux Éléments de SQL/PSM (Suite) Variables locales (DECLARE) Valeur de retour (RETURNS) des fonctions (FUNCTION) Assignement des variables avec SET Branches et boucles: IF (condition) THEN instructions; ELSEIF (condition) instructions; … ELSE instructions; END IF; LOOP instructions; END LOOP Des requêtes peuvent faire partie des expressions Les curseurs peuvent être naturellement utilisés sans EXEC SQL

18 Résumé Le SQL imbriqué permet lexécution de requêtes paramétriques et statiques au sein dun langage hôte Le SQL dynamique permet lexécution de requêtes ad-hoc au sein dun langage hôte Le mécanisme de curseur permet de puiser un tuple à la fois et de résoudre l impedance mismatch entre la langage hôte et SQL Des APIs tels que JDBC introduisent un niveau dabstraction entre lapplication et le SGBD

19 Résumé (Suite) SQLJ est un modèle statique de requêtes vérifiées pendant la compilation Les procédures stockées exécutent la logique de lapplication directement sur le serveur SQL/PSM est un standard pour lencodage des procédures stockées