190 likes | 300 Views
Développement des Applications des Bases de Données. Chapitre 6, Sections 6.3.6--6.5. Survol. JDBC SQLJ Procédures stockées. 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.
E N D
Développement des Applications des Bases de Données Chapitre 6, Sections 6.3.6--6.5
Survol • JDBC • SQLJ • Procédures stockées
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 l’info au sujet du driver: System.out.println(“Name:” + md.getDriverName() +“version: ” + md.getDriverVersion());
JDBC: Examen des Metadonnées (Suite) • Un objet de la classe DatabaseMetaData contient 134 méthodes!!! - getCatalog() - getIndexInfo() - getTables() - getMaxConnections() etc.
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” + “ “); } }
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 ()); }
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.
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 l’application a déjà fixé la valeur de ‘rating’ #sailors = { SELECT sid, sname INTO :sid, :nameFROM Sailors WHERE rating = :rating }; // puise les résultats while (sailors.next()) { System.out.println(sailors.sid + “ “ + sailors.sname)); } sailors.close();
Iterateurs SQLJ Deux type d’ité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}
Procédures Stockées • Définition d’une procédure stockée: • Programme exécuté à travers une seule instruction SQL • Exécutée dans l’espace des processus du serveur • Avantages: • Peut encapsuler la logique de l’application et en même temps être près de la source de données • Réutilise la logique de l’application par différents utilisateurs • Retourne les données en évitant l’utilisation des curseurs
Procédures Stockées: Exemples CREATE PROCEDURE ShowNumReservationsSELECT S.sid, S.sname, COUNT(*)FROM Sailors S, Reserves RWHERE S.sid = R.sidGROUP 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 + increaseWHERE sid = sailor_sid
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”
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);
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()) { … } Exécution des Procédures Stockées (Suite)
SQL/PSM La plupart des SGBDs permettent aux utilisateurs de stocker des procédures en usant d’un language simple et tout usage proche de SQL Le standard SQL/PSM est représentatif de tels langages. Déclaration d’une procédure stockée: CREATE PROCEDURE name(p1, p2, …, pn) déclarations de variables locales code de la procédure; Declaration d’une fonction: CREATE FUNCTION name (p1, …, pn) RETURNS Type de données se SQLdéclarations de variables locales code de la fonction;
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;
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”
Résumé • Le SQL imbriqué permet l’exécution de requêtes paramétriques et statiques au sein d’un langage hôte • Le SQL dynamique permet l’exécution de requêtes ad-hoc au sein d’un 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 d’abstraction entre l’application et le SGBD
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 l’application directement sur le serveur • SQL/PSM est un standard pour l’encodage des procédures stockées