Title: D
1Développement des Applications des Bases de
Données
2Survol
-
- SQL dans les codes dapplication
- SQL imbriqué
- Curseurs
- SQL dynamique
- JDBC
- SQLJ
- Procédures stockées
3SQL dans les codes dApplication
- Les commandes SQL peuvent être appelées à partir
dun programme dapplication (langage hôte --
C, Java, etc). - Les instructions SQL peuvent référer à des
variables du langage hôte (y compris des
variables utilisées pour retourner les statuts). - Doivent inclure une instruction pour connecter à
la base de données appropriée. - Deux approches dintégration existent
- Instructions SQL imbriquées dans le langage hôte
( Embedded SQL , SQLJ) - Création dune API spéciale pour appeler les
commandes SQL (JDBC)
4SQL dans les codes dApplication (Suite)
- Défaut dadaptation dimpédance ( impedance
mismatch ) - Les relations SQL sont des (multi)ensembles de
tuples qui nimposent aucune limite apriori sur
le nombre de tuples. Les langages de
programmation traditionnels (C, C, etc.) nont
pas une telle structure de données. (Exception
STL) - SQL supporte un mécanisme appelé curseur pour
résoudre ce problème. - Un curseur est un élément additionnel de SQL qui
comble le fossé causé par le défaut de
ladaptation dimpédance.
5SQL Imbriqué Variables
- EXEC SQL BEGIN DECLARE SECTION
- char c_sname20
- long c_sid
- short c_rating
- float c_age
- EXEC SQL END DECLARE SECTION
- Deux problèmes avec les variables (i)
correspondance des types (solution
casting/correspondance explicite), et (ii)
impedance mismatch (solution le mécanisme de
curseur). - Deux variables spéciales derreur (une au moins
doit être déclarée) - SQLCODE (long, est négative si une erreur est
apparue) - SQLSTATE (char6, codes prédéfinies pour des
erreurs usuelles)
6SQL Imbriqué Instructions
- Approche instructions SQL imbriquées dans le
langage hôte. - préprocesseur convertit les instructions SQL en
des appels API. - Ensuite un compilateur régulier prend le relais
pour compiler le code. - Éléments du langage
- Pour connecter à une base de donnéesEXEC SQL
CONNECT - Pour exécuter des instructions SQLEXEC SQL
Statement
7 SQL Imbriqué Instructions (Suite)
- Exemple
- Insérer une ligne avec des valeurs issues des
variables du langage hôte - EXEC SQL
- INSERT INTO Sailors
- VALUES (c_sname, c_sid, c_rating, c_age)
- Commande spéciale pour contrôler les erreurs
après des instructions SQL - EXEC SQL
- WHENEVER SQLERRORNOT FOUND
- CONTINUEGOTO smt
8Curseurs Intuition
- On peut déclarer un curseur sur une relation ou
une instruction de requête (qui en fait génère
une relation). - On peut ouvrir un curseur déclaré, et lutiliser
pour puiser (fetch) de manière répétée des
tuples et, après, déplacer le curseur, jusquà ce
que tous les tuples aient été récupérés. - On peut utiliser une clause spéciale, appelée
ORDER BY, dans les requêtes accessibles aux
curseurs afin de contrôler lordre dans le quel
les tuples doivent être récupérés. - Les attributs mentionnés dans la clause ORDER BY
doivent aussi lêtre dans la clause SELECT. - On peut enfin clore un curseur ouvert.
- On peut aussi modifier/effacer des lignes en
utilisant un curseur. Cependant, INSERT, DELETE,
et UPDATE peuvent être utilisés sans curseur.
9Exemple dUtilisation de Curseur
EXEC SQL DECLARE sinfo CURSOR FOR SELECT
S.sname FROM Sailors S, Boats B, Reserves
R WHERE S.sidR.sid AND R.bidB.bid AND
B.colorred ORDER BY S.sname
- sinfo est le curseur.
- Il est illégale de remplacer S.sname par S.sid
dans la clause ORDER BY ! (Pourquoi?) - Peut-on ajouter S.sid à la clause SELECT et
remplacer S.sname par S.sid dans la clause ORDER
BY ?
10Curseur Syntaxe
- Syntaxe générale pour déclarer les curseurs
- DECLARE cursorname
- INSENSITIVE SCROLL
- CURSOR WITH HOLD FOR query
- ORDER BY order-item-list
- FOR READ ONLY FOR UPDATE
- INSENSITIVE une copie privée du curseur est
faite - SCROLL permet plus de flexibilité pour
lopération FETCH - WITH HOLD curseur nest pas fermé quand la
transaction est validée. - Variante de la commande UPDATE pour les
curseurs - UPDATE table
- SET expression
- WHERE CURRENT OF cursorname
11Imbriquer SQL dans C Exemple
- char SQLSTATE6
- EXEC SQL BEGIN DECLARE SECTION
- char c_sname20 short c_minrating float c_age
- EXEC SQL END DECLARE SECTION
- c_minrating random()
- EXEC SQL DECLARE sinfo CURSOR FOR
- SELECT S.sname, S.age FROM Sailors S
- WHERE S.rating gt c_minrating
- ORDER BY S.sname
- do
- EXEC SQL FETCH sinfo INTO c_sname, c_age
- printf(s is d years old\n, c_sname, c_age)
- while (SQLSTATE ! 02000)
- EXEC SQL CLOSE sinfo
12SQL Dynamique
- Les instructions SQL imbriquées sont connues par
le compilateur à lavance (compile time). - Il y a des situation où ce nest pas le cas
(p.ex. tableurs, interfaces des SGBDs
graphiques) il faut donc permettre la
dinstructions SQL en passant ( on-the-fly
/run time)! - Deux commandes principales à ce sujet
- PREPARE sql_cmd FROM sql_string
- EXECUTE sql_cmd
- Exemple
- char c_sqlstring DELETE FROM Sailors WHERE
raitinggt5 - EXEC SQL PREPARE readytogo FROM c_sqlstring
- EXEC SQL EXECUTE readytogo
13Database APIs Alternative to Embedding
- Au lieu de modifier le compilateur, ajouter des
bibliothèques avec des instructions dappel des
bases de données (API). - Interface spéciale standard procédures/objets
- Passer les instructions SQL (en forme de chaînes
de caractères) à partir du langage hôte, et
présenter les ensembles de résultats dans une
manière compréhensible pour le langage hôte. - JDBC de Sun Coorporation API Java
- JDBC est supposé être indépendant de tout SGBD
- Un pilote (driver) reçoit les instructions
dappel et les traduit dans le code spécifique du
SGBD. - La base de données peut se trouver à un autre
bout du réseau.
14JDBC Architecture
- Quatre composantes architecturales
- Application (initie et termine des connexions,
soumet des instructions SQL) - Gestionnaire des pilotes (Driver manager)
(choisit --loads-- un driver JDBC) - Driver (connecte à la source des données,
transmet des requêtes et retourne/traduit les
résultats et les codes derreur) - Source des données (exécute les instructions SQL)
15JDBC Types de Drivers
- Pont (Bridge)
- Traduit les commandes SQL en une API non
native.Exemple le pont JDBC-ODBC. Le code pour
les drivers ODBC et JDBC doivent être présents
sur chaque client. - Traduction directe en une API native via un
driver hors Java - Traduit les commandes SQL en une API native des
la source des données. Besoin dun code binaire
spécifique à chaque SO sur chaque client. - Pont sur réseau (network bridge)
- Les commandes sont envoyées via le réseau à un
module intermédiaire (middleware) qui est un
serveur parlant à la source des données. Seul
besoin un petit driver JDBC sur chaque client. - Traduction directe en une API native via un
driver Java - Convertit les instructions dappel JDBC
directement dans le protocole de réseau que le
SGBD utilise.Besoin dun driver Java spécifique à
chaque SGBD sur chaque client.
16Classes et Interface pour JDBC
- Étapes pour soumettre une requête
- Choisir le driver JDBC
- Connecter à la source de données
- Exécuter les instructions SQL
17Gestionnaire des Pilotes JDBC
- Tous les drivers sont gérés par la classe
DriverManager - Choix dun driver JDBC (3 voies possibles)
- Dans le code JavaClass.forName(oracle/jdbc.driv
er.Oracledriver) - Retourne lobjet de la classe driver au vu de
son nom complet. - En démarrant une application Java (à la ligne des
commandes)-Djdbc.driversoracle/jdbc.driver - En créant un objet driver explicitement
18Connexions JDBC
- Linteraction avec une source de données se fait
par lentremise dune session qui est démarrée
par la création dun objet de type
Connection. Chaque session est démarrée via
un URL JDBC. - URL JDBC(i.e. un URL utilisant le protocole
JDBC) - jdbcltsousprotocolegtltautresParametresgt
- Exemple Etablir une connexion à une BD Oracle
précise - String urljdbcoraclewww.bookstore.com3083
- connexion con
- try
- con DriverManager.getconnexion(url,usedId,passw
ord) - catch SQLException excpt
19Interface pour les Connexions
- public int getTransactionIsolation() et void
setTransactionIsolation(int level)Détermine le
degré disolation de la connexion en cours. - public Boolean getReadOnly() et
- void setReadOnly(boolean b)Spécifie si les
transactions dans la connexion sont pour lecture
seulement (read-only). - public boolean getAutoCommit() et void
setAutoCommit(boolean b)Si autocommit est vrai,
chaque instruction SQL est considérée comme une
transaction autonome. Sinon, la transaction est
validée par commit(), ou abandonnée par
rollback(). - public boolean isClosed()Vérifie si la connexion
est encore ouverte.
20Exécution des Instructions SQL
- Trois manière différentes de le faire (i.e. en
utilisant 3 classes appropriées pour des objets
de type statement) - Statement (permet des requêtes avec soit des
instructions SQL statiques soit dynamiques) - PreparedStatement (instructions semi-statiques)
- CallableStatement (procédures stockées)
- La classe PreparedStatementgénère dynamiquement
des instructions SQL précompilées et
paramétrisées - Structure fixe
- Valeurs des paramètres déterminées pendant
lexécution
21Exécution des Instructions SQL (Suite)
- String sqlINSERT INTO Sailors VALUES(?,?,?,?)
- PreparedStatment pstmtcon.prepareStatement(sql)
- pstmt.clearParameters()
- pstmt.setInt(1,sid) // Supposons que sid,
sname, - pstmt.setString(2,sname) // sont des vars Java
avec - pstmt.setInt(3, rating) // des valeurs à
insérer. - pstmt.setFloat(4,age)
- // Savons que aucune ligne nest
retournées, - // doù nous utilisons executeUpdate()
- int numRows pstmt.executeUpdate()
22Ensembles des Resultats
- PreparedStatement.executeUpdate retourne
seulement le nombre de ligne affectées. - PreparedStatement.executeQuery retourne les
donnees, repris dans un objet ResultSet (un
curseur) - ResultSet rspstmt.executeQuery(sql)
- // rs est un curseur next() puise la prochaine
ligne - While (rs.next())
- // traiter les données
23Ensemble des Resultats (Suite)
- Un ResultSet est un curseur très puissant
- previous() reculer dune ligne
- absolute(int num) avancer à la ligne dont le
numéro dordre est indiqué - relative (int num) avancer ou reculer selon la
valeur indiquée - first() et last()
24Correspondance entre les Types de Données Java
vs SQL
SQL Type Java class ResultSet get method
BIT Boolean getBoolean()
CHAR String getString()
VARCHAR String getString()
DOUBLE Double getDouble()
FLOAT Double getDouble()
INTEGER Integer getInt()
REAL Double getFloat()
DATE java.sql.Date getDate()
TIME java.sql.Time getTime()
TIMESTAMP java.sql.TimeStamp getTimestamp()
25JDBC Exceptions et Avertissements
- java.sql émet des exceptions SQLException si une
erreur apparaît. - SQLWarning est une sousclasse de SQLException
(pas du tout émis mais leur existence doit etre
explicitement testé si on veut les voir) - Méthodes dans la classe SQLException
getMessage(), getSQLState(), getErrorCode(),
getNextException(),
26JDBC Exceptions et Avertissements (Suite)
- try
- stmtcon.createStatement()
- warningcon.getWarnings()
- while(warning ! null)
- // traiter le SQLWarnings
- warning warning.getNextWarning()
-
- con.clearWarnings()
- stmt.executeUpdate(queryString)
- warning con.getWarnings()
-
- //end try
- catch( SQLException SQLe)
- // traiter lexception
-