Sections 6.4

publicité
Développement des Applications des
Bases de Données
Chapitre 6, Sections 6.3.6--6.5
1
Survol
JDBC
 SQLJ
 Procédures stockées

2
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());
3
JDBC: Examen des Metadonnées (Suite)

Un objet de la classe DatabaseMetaData contient
134 méthodes!!!
- getCatalog()
- getIndexInfo()
- getTables()
- getMaxConnections()
etc.
4
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” + “ “);
}
}
5
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 ());
}
6
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.
7
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, :name
FROM Sailors WHERE rating = :rating
};
// puise les résultats
while (sailors.next()) {
System.out.println(sailors.sid + “ “ + sailors.sname));
}
sailors.close();
8
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
}
9
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
10
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
11
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”
12
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);
13
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()) {
…
}
14
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 SQL
déclarations de variables locales
code de la fonction;
15
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;
16
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”
17
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

18
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

19
Téléchargement