Title: Interface SQLLangages htes
1Interface SQL-Langages hôtes
- http//www.loria.fr/skaf/cours/sybase/sybase.html
2Plan
- Introduction
- Deux approches
- approche pré-compilée
- approche compilée
- Approche pré-compilée Embedded SQL de sybase
- comment écrire un programme ESQL/C?
- Synthèse
- Bibliographies
3Interface SQL-Langages hôtes
- Pourquoi?
- SQL tout seul est insuffisant pour écrire des
applications complètes. - Ex application pour produire les factures, gérer
les clients dune entreprise.. - Problèmes
- Impedance mismatch
- Mariage des paradigmes
4Problèmes
- Impedance mismatch
- SQL a ses propres types de données
- le langage de programmation considéré (C, COBOL,
) a ses propres types - faire correspondre les deux ensembles de types.
- Mariage des paradigmes
- SQL est un langage déclaratif orienté ensemble
(le résultat dune requête SQL est un ensemble) - les langages de programmation classiques sont de
nature procédurale c.à.d. Orientés tuples ou
un à la fois - faire appel à des structures itératives pour
manipuler les ensembles résultants dune
évaluation de requête.
5Interface SQL-Langages hôtes
- Deux approches
- Approche pré-compilée
- Approche compilée
6Approche pré-compilée
Programme source dans le langage hôte, où les
instructions adressées au SGBD ont été
traduites dans le langage hôte
Programme source écrit dans le langage hôte
(C,Cobol, Java!) des instructions
(requêtes SQL) adressées au SGBD
Programme exécutable
précompilation
compilation édition de liens
- Exemples
- dans Oracle V6, PROC/C
- dans Sybase V11, Embedded SQL (ESQL)
7Approche compilée
Programme source écrit dans le langage hôte
(C,Cobol, Java!) des fonctions dune
bibliothèques permettant décrire des
instructions (requêtes SQL) adressées au SGBD
Programme exécutable
compilation édition de liens
- Exemples
- dans Oracle CLI (Callable Level Interface)
- dans Sybase V11, DB_library\C
8Approche pré-compilée Embedded SQL de sybase
- Sybase Open Client Embedded SQL est un produit
permettant à un programmeur d'utiliser de
commandes Transact SQL dans un programme écrit
dans un langage hôte tel que C ou Cobol. - Chaque commande Transact SQL est précédée par le
mot clé exec sql et termine par - Exemple la table titles(title_id,title,price)
- exec sql update titles set priceprice1.10
9ESQL/C
exemple.cp
exemple.c
Open client Embedded SQL Precomplier
Programme ESQL
Programme C
Compilateur C
Code objet
Edition de lien
Programme exécutable
Open client client-library
10Programmation avec ESQL/C
- Chaque programme suit le schéma suivant
- Inclusion de la zone de communication SQLCA
- Déclaration des variables (globales ou locales)
- Déclaration de gestion des erreurs
- Connexion au(x) serveurs Sybase
- Exécution des requêtes
- Fermeture de la (des) connections
- Gestion des erreurs
11Inclusion de la zone de communication SQLCA
- Chaque programme doit commencer par linclusion
de la zone de communication SQLCA (SQL
Communication Area). - exec sql include sqlca
- sqlca est une structure de données permettant de
gérer la communication (les messages) entre le
serveur SQL et le programme. - Elle permet dinformer le programme sur létat
dexécution de la dernière requête SQL. - Elle est remise à jour après lexécution de
chaque commande Transact-SQL.
12Description des variables de SQLCA
- variable type description
Char long long long char long6 char
Sqlcaid sqlcabc sqlcode sqlrrm.sqlerrml sqlerr
p sqlerrd sqlerrm.sqlerrmc
Identificateur de la zone de communication. long
ueur de la structure SQLCA Contient les codes de
retours de chaque requête 0 tout va bien, -n
erreur n numéro derreur 100 plus des lignes
dans le résultat Longueur du message
derreur. Le programme qui a détecté
lerreur détail de lerreur ou du warning,
sqlerrd2 numéro des linges affectées message
derreurs .
13Description des variables de SQLCA
- variable type description
W , pas de warning. W , la
variable pour stocker le résultat est très
petit, le résultat a été tronqué. W , une
valeur nulle est envoyée au serveur (dans un
contexte qui linterdit) nb de colonnes dune
dans un select gt nb de variables dans la partie
into. réservé erreur de conversion pendant
lexécution de reqte réservé réservé
sqlwarn0 sqlwarn1 sqlwarn2 sqlwarn3 sq
lwarn4 sqlwarn5 sqlwarn6 sqlwarn7
char char char char char char char char
14Déclaration des variables
- Variable-hôte désigne une variable déclarée
dans un programme C et destinée à contenir des
valeurs en provenance ou à destination du serveur
SQL (de la base de données) - Les variables utilisées dans les requêtes sont
définies dans une zone spéciale - Exemple
- exec sql begin declare section
- CS_char user31,passwd32 / variable du type
ESQL/ - int n / variables du type C/
- char nom30
- exec sql end declare section
15Correspondance des types de ESQL/C varaibles
C long none charn none none ...
SQL serveur int none char datetime numérique
.
ESQL (Sybase-supplied typedef) CS_INT CS_VARCHA
R CS_CHAR CS_DATETIME CS_NUMERIC ...
Description 4-byte type entier variable-length
type caractère type caractère 8-byte type
datetime type numérique ...
16Exemple
- Soit la table titles(title_id,title,
type,pub_id) /title_id est du type char5 / - exec sql begin declare section
- CS_char id5 / le type CS_char est
compatible avec le type char de Sybase/
- exec sql end declare section
- exec sql select title_id into id from titles
- where pub_id 0736 and type business
- Attention la syntaxe dutilisation de variables
dans une clause Transact-SQL (nom_variable)
17Déclaration de gestion des erreurs
- exec sql whenever sqlwarningsqlerrornot found
continuego to label call ma_fonction(param1,p
aram2,.)stop - Exemples
- Appel dune fonction pour traiter les erreurs
- exec sql whenever sqlerror call erreur_p()
- Appel dune fonction pour traiter les warning
- exec sql whenever sqlwarning call warning_p()
- / les fonctions erreur_p et warning_p sont
définies par la suite / - Continue en cas de not found
- exec sql whenever not found continue
18Connexion au serveur
- Syntaxe
- exec sql connect usridentified by password
- at connection_name using
server - Exemple
- strcpy(user, "moi")
- strcpy(passwd,"bd99")
- exec sql connect user identified by passwd
19Exécution des requêtes
- Syntaxe exec sql SQL_expression
- La plupart de SQL_expression respect la syntaxe
de Transact-SQL de Sybase - Exemple
- titles(title_id,title,price)
- exec sql update titles set priceprice1.10
- Sauf les requêtes de sélection qui peuvent avoir
le mot clé into dans leur définition. - Exemple
- exec sql select title_id into id from titles
- where pub_id 0736 and type business
20Requêtes de sélection
- Où peut-on stocker le résultat dune requête ?
- Deux cas possibles
- Le résultat de la requête est une valeur.
- Le résultat de la requête est une relation (un
ensemble de valeurs )
21Le résultat de la requête est une valeur
- On peut utiliser des variables pour stocker le
résultat de la requête. - Exemple
- exec sql select title_id, title into id, titre
from titles - where pub_id 0736 and type business
- Attention
- Le type de la variable id doit être compatible
avec le type de la colonne title_id de la table
titles. - Le type de la variable titre doit être compatible
avec le type de la colonne title de la table
titles
22Le résultat de la requête est plusieurs lignes
- Deux possibilités pour stocker le résultat
- on peut utiliser une variable de type tableau ou
array - on peut utiliser le curseur classique de Sybase.
23Variable de type array
- Applicable si on connaît le nombre maximal de
lignes envoyées par le serveur SQL (nombre
maximal des lignes dans le résultat) - Exemple
- exec sql begin declare section
- CS_CHAR titleid_array1006
- exec sql end declare section
- exec sql select title_id into titleid_array from
titles
24Exemple (suite)
- Pour afficher le résultat de la requête
précédante (exec sql select title_id into
titleid_array from titles), il faut écrire - for (i o iltsqlca.sqlerrd2 i)
-
- printf(title_id s\n,titleid_arrayi)
25Utilisation des curseurs
- Utile lorsquon ne connaît pas le nombre maximal
des lignes envoyées par le serveur SQL. - Rappel Quest-ce que cest un curseur?
- Un curseur est un nom symbolique associé à une
instruction select Transact-SQL. Il se compose - dun ensemble (table) de lignes résultant de
l'exécution d'une requête associée au curseur. - la position du curseur pointeur sur une ligne.
26Rappel curseur de Sybase
- A quoi ça sert?
- à consulter les résultats de sa requête ligne par
ligne. - Comment lutiliser?
- Déclaration du curseur
- declare curseur_nom cursor for select_expression
- Ouverture du curseur
- open curseur_nom
- Parcours (extraire) des lignes
- fetch curseur_nom into liste_variables
- Fermeture
- close curseur_nom
27Les curseurs dans un programme ESQL/C
- / Déclaration du curseur /
- exec sql declare c1 cursor for
- select title_id,title,pub_id,price
from titles where pricegt10 - / Ouverture du curseur /
- exec sql open c1
- / Pour chaque ligne /
- for ()
- / Récupérer les valeurs dans les varaibles id,
pub_id, price/ - exec sql fetch c1 into id, title, pub_id,
price - if (sqlca.sqlcode 100)
- break / Plus de lignes arrête la boucle /
- printf ("ids, title s, pub_id d, price
.2f\n",id,title,pub_id,price) -
- / Fermeture du curseur /
- exec sql close c1
28Fermeture de la connexion
- Syntaxe
- exec sql disconnect connection_nameallcurrent
- Exemple
- exec sql disconnect all
- / Fermeture de toutes les connections aux
serveurs /
29Exemple complet (1) exemple1.cp
- / definition de la zone de communication /
- exec sql include sqlca
- main()
- / debut des declarations /
- exec sql begin declare section
- / Variable pour le login et le mot de passe /
- CS_CHAR user31,passwd32
- / fin des déclarations /
- exec sql end declare section
- / Detournement des erreurs provenant du serveur
/ - exec sql whenever sqlerror call err_p()
- strcpy(user, "moi")
- strcpy(passwd,"bdbdbd")
- / Ouverture de la connexion /
- exec sql connect user identified by
passwd - / Requetes Transact SQL /
- exec sql use Lice
- exec sql update titles set priceprice1.10
- exec sql commit work
30Le fichier Makefile
- INCLUDE -I. -ISYBASE/include
- LIBFLAGS -LSYBASE/lib
- CFLAGS (INCLUDE) (LIBFLAGS)
- PRECOMP SYBASE/bin/cpre
-
- all exemple1
- exemple1 exemple1.c
- gcc (CFLAGS) -o exemple1 SYBASE/include/sybes
ql.c\ - exemple1.c -lct -ltcl -lcomn -lcs -lintl
-lsocket -lct - exemple1.c exemple1.cp
- (PRECOMP) exemple1.cp
31Requêtes dynamiques
- Dans un programme ESQL, on peut écrire de
requêtes dynamiques. - Une requête est dynamique si elle est construite
de manière interactive à lexécution. - Il est possible de fournir des squelettes de
requêtes au pré-compilateur, à compléter lors de
lexécution.. - Très utile dans le cas dun dialogue avec
lutilisateur. - Dynamique SQL fait partie du standard
ANSI /ISO SQL2.
32Exemple dutilisation de Dynamique SQL
- Lors dune interrogation, on peut spécifier les
critères de sélection - select from titles where type ? and
price between ? and ? - ("?") est un paramètre dynamique
- ("?") représentent les places où lutilisateur
peut entrer les valeurs de recherche..
33Méthodes de Dynamique SQL
- Méthode 1 execute immediate
- Méthode 2 prepare and execute
- Méthode 3 prepare and fetch
- Méthode 4 prepare and fetch with
- A détailler
34Synthèse de lapproche pré-compilée de Sybase
- Approche simple (conceptuellement)
- permet daccéder à une base de données à partir
d une application écrit dans un langage de
programmation (ici C) de manière simple. - ESQL est un standard ANSI/ISO
- Inconvénients ??
35Bibliographies
- La documentation de sybase
- Open Client Embedded SQL/C Programmers Guide
- Embedded SQL Reference Manual
- doc en ligne
- http//sybooks.sybase.com/onlinebooks/group-cn/cng
1110e/esqlc - Embedded SQL/C sample programs
- http//techinfo.sybase.com/css/techinfo.nsf/DocID/
ID20376