230 likes | 357 Views
Connexion en mode application. 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
E N D
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
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
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
Cycle de vie d’un programme ex.pc ex.c Précompilateur oracle Programme source Programme source modifié Éditeur de texte Compilateur standard Programme exécutable Editeur de liens Programme objet ex.out ex.o Bibliothèque oracle Bases de données - Yann Loyer
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
Structure d’un programme Un programme ProC est composé de deux sections: • Prologue de l’application • Corps de l’application Bases de données - Yann Loyer
Prologue (1) • Cette partie est divisée en 3 sous-sections : • Section INCLUDE • Section DECLARE • Section CONNECT Bases de données - Yann Loyer
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
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
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
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
Requêtes Deux façons de traiter les requêtes : • Requête renvoyant un seul n-uplet • Requête renvoyant un nombre quelconque de n-uplets Bases de données - Yann Loyer
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
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
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
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
Exemple de programme void déconnexion() { EXEC SQL commit release; compte_rendu(); } Bases de données - Yann Loyer
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
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
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
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
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( ); } Bases de données - Yann Loyer