connexion en mode application. bases de données - yann loyer2 connexion en mode application pour...
TRANSCRIPT
Connexion en mode application
Bases de données - Yann Loyer 2
Connexion en mode application
• Pour tout type d’utilisateurs :– passif, actif, gérant
• Permettre l’accès au SGBD à partir d’un langage de haut niveau (C, JAVA, …)
• Problèmes BD – traités exactement comme en interactif– + programmation non BD pour :
• Calculs• Conversationnel• Contrôle (ex: récursivité)
Bases de données - Yann Loyer 3
Principe
• Programme classique (C, JAVA,…)
+ connexion serveur
+ tout ordre SGBD
+ gestion de la communication client/serveur
• Pour résoudre des problèmes :– utiliser les mêmes ordres qu’en mode interactif
Bases de données - Yann Loyer 4
Cycle de vie d’un programme
• Ordres SGBD inclus :– ne sont pas des instructions du langage hôte– lors de la précompilation
• détectés
• Remplacés par du C
– lors de l’exécution• transmis au serveur
Bases de données - Yann Loyer 5
Cycle de vie d’un programme
Éditeur detexte
Programmesource
Précompilateuroracle
Programmesource modifié
Compilateurstandard
Programmeobjet
Editeurde liens
Programmeexécutable
Bibliothèqueoracle
ex.pc ex.c
ex.oex.out
Bases de données - Yann Loyer 6
Vocabulaire
• C : langage hôte
• Programme s’exécutant : client en mode application
• Ordres SGBD : ordres inclus (embedded SQL statements)
• Variables hôtes : variables qui hébergent les valeurs SGBD
Bases de données - Yann Loyer 7
Structure d’un programme
Un programme ProC est composé de deux sections:
1. Prologue de l’application
2. Corps de l’application
Bases de données - Yann Loyer 8
Prologue (1)
• Cette partie est divisée en 3 sous-sections :
1. Section INCLUDE
2. Section DECLARE
3. Section CONNECT
Bases de données - Yann Loyer 9
Prologue (2)
• Section INCLUDE permet la mise en action de certaines options par utilisation de variables
#INCLUDE<SQLCA.H>• Par défaut, ProC ignore toutes les erreurs et
continue l’exécution si possible• Exemples de variables
– sqlca.sqlcode – Sqlca.sqlwarn
Bases de données - Yann Loyer 10
Prologue (3)
• La section DECLARE contient les définitions de variables hôtes
EXEC SQL BEGIN DECLARE SECTION;
int numemp;
char nomemp[10];
int numdep;
EXEC SQL END DECLARE SECTION;
Bases de données - Yann Loyer 11
Prologue (4)
• Section CONNECT : tout programme ProC doit effectuer une connexion à un SGBD Oracle avant d’accéder aux données
• EXEC SQL CONNECT :user IDENTIFIED BY :password;
• Cette commande SQL doit être la première commande exécutable du programme ProC
Bases de données - Yann Loyer 12
Corps de l’application• Cette partie contient le corps du programme ProC. Exemple#include<sqlca.h>EXEC SQL BEGIN DECLARE SECTION; varchar uid[20]; varchar pwd[20];EXEC SQL END DECLARE SECTION;main( ){ strcpy(uid.arr,’SCOTT’); uid.len = strlen(uid.arr); strcpy(pwd.arr,’TIGER’); pwd.len = strlen(pwd.arr);
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd; printf(« connecté à Oracle comme utilisateur : %s », uid.arr); EXEC SQL CREATE TABLE VINS(NV number, Nom varchar(15), Domaine varchar(25)); printf(« Table VINS créée »); EXEC SQL COMMIT WORK;}
Bases de données - Yann Loyer 13
Requêtes
Deux façons de traiter les requêtes :
1. Requête renvoyant un seul n-uplet
2. Requête renvoyant un nombre quelconque de n-uplets
Bases de données - Yann Loyer 14
Requêtes
Requête renvoyant un seul n-uplet
SELECT att1,…,attn
INTO :var1, …, :varn
FROM table1,…,tablem
WHERE …
Bases de données - Yann Loyer 15
Exemple
Situation :
• Train ( client varchar(20),
destination varchar(20),
jour integer
km integer );
• Hypothèse : une seule destination par client
• Objectif : afficher la destination et le jour de Félix
Bases de données - Yann Loyer 16
Exemple de programme #include<stdio.h>#include<string.h>#include<sqlca.h>
void connexion();void interrogation();void déconnexion();void compte_rendu();
main(){connexion();interrogation();déconnexion();}
Bases de données - Yann Loyer 17
Exemple de programme void connexion(){EXEC SQL begin declare section; char hs_login[8]; char hs_passwd[8];EXEC SQL end declare section;
strcpy(uid.arr,’SCOTT’); uid.len = strlen(uid.arr); strcpy(pwd.arr,’TIGER’); pwd.len = strlen(pwd.arr);
EXEC SQL connect :hs_login identified by :hs_passwd ;compte_rendu();}
Bases de données - Yann Loyer 18
Exemple de programme
void déconnexion()
{
EXEC SQL commit release;
compte_rendu();
}
Bases de données - Yann Loyer 19
Exemple de programme void interrogation(){EXEC SQL begin declare section; char hs_dest[20]; int hi_jour;EXEC SQL end declare section;
EXEC SQL select destination, jour into :hs_dest, :hi_jour ; from train where client = « Félix »;
compte_rendu();printf( « Félix va à %s le jour %d », hs_dest, hi_jour );}
Bases de données - Yann Loyer 20
Exemple de programme
void compte_rendu()
{
If (sqlca.sqlcode < 0)
{
printf( « Ordre non exécuté : %s », sqlca.sqlerrm.sqlerrmc);
exit;
}
}
Bases de données - Yann Loyer 21
Requêtes • Lorsque la requête retourne plusieurs n-uplets, le
résultat est stocké dans un curseur DECLARE CURSOR OPEN CURSOR FETCH CLOSE CURSOR
• Un curseur est une zone de travail utilisée par Oracle pour stocker le résultat d’une requête
Bases de données - Yann Loyer 22
Exemple de programme void selection(){Char tampon[100];EXEC SQL begin declare section; int hi_km; char hs_dest[20]; int i_dest;EXEC SQL end declare section;
gets(tampon);hi_km = atoi(tampon);EXEC SQL DECLARE requête CURSOR FOR select destination from train where km < :hi_km ;
EXEC SQL OPEN requête;compte_rendu();
Bases de données - Yann Loyer 23
EXEC SQL FETCH requête INTO :hs_dest:i_dest ; /* i_dest variable indicatrice */
gestion_erreur( );
while ((sqlca.sqlcode>=0) && (sqlca.sqlcode!=1403))
{
if (i_dest == -1) printf(« destination inconnue »);
else printf(« %s\n »,hs_dest);
EXEC SQL FETCH requête INTO :hs_dest:i_dest ;
gestion_erreur( );
}
EXEC SQL CLOSE requête;
gestion_erreur( );
}