Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke1 Développement des Applications des Bases de Données Chapitre 6, Sections
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke2 Survol JDBC SQLJ Procédures stockées
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke3 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());
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke4 JDBC: Examen des Metadonnées (Suite) Un objet de la classe DatabaseMetaData contient 134 méthodes!!! - getCatalog() - getIndexInfo() - getTables() - getMaxConnections() etc.
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke5 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 + ); }
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke6 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 ()); }
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke7 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.
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke8 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();
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke9 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 }
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke10 Procédures Stockées Définition dune procédure stockée: Programme exécuté à travers une seule instruction SQL Exécuté dans lespace des procès 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
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke11 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
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke12 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
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke13 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);
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke14 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()) { … }
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke15 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;
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke16 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;
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke17 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
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke18 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
Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke19 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