SQL et Langages de Programmation SQL est un langage bases de données autonome. Langage ensembliste de haut niveau Il faut un langage de programmation, pour programmer des applications de gestion o Notion de variables, structures de contrôles, etc. o SQL est exécuté à l'intérieur d'un programme d'application Nécessité de coupler SQL avec un langage plus classique (dit langage hôte) «Impedence mismatch» o SQL : haut niveau, traitement ensembliste, données persistantes, accès par valeur o Langage programmation : algorithmique, données temporaires, accès par adresse Couplage fort ou couplage faible? Najib Tounsi 1
SQL et Langages de programmation : Couplage Fort SQL est augmenté d un ensemble de constructions intégrées permettant son usage en programmation. Intégration cohérente, un seul compilatur. o E.g. types tuple, relation, etc (cf. Pascal-Relationnel) o Traitement ensembliste intégré au langage (e.g. instruction foreach etc. ) Plus ou moins un nouveau langage de programmation (nouveau compilateur, etc.) PL/SQL, entre autres, est un exemple commercial (oracle) Dans une moindre mesure PHP/Mysql, JDBC etc. (voir après) Les L4Gs aussi sont de ce type. Solutions propriétaires Najib Tounsi 2
SQL et Langages de programmation : Solution type middleware Usage d une API qui fait l interface entre le programme et le serveur BD (moteur SQL) PHP/..SQL o mysql_select_db("store",$link); o $result = mysql_query("select * FROM employee",$link); o $row = mysql_fetch_row($result) o echo mysql_result($result,0,ename); o printf("", $row[0], $row[1], $row[2], $row[3], $row[4]); Du coté du programme on manipule des données de types courants du langage hôte. Variables ((e.g. $link, $result, $row...) ) remplies par appel à des fonctions prédéfinies (API orientée SQL). Cf. JDBC Najib Tounsi 3
SQL et Langages de programmation : Couplage Faible SQL est exécuté à l'intérieur d'un programme d'application. Les requêtes SQL sont incorporées aux instructions d'un programme. On dit «Embedded SQL» ESQL. ESQL/C, ESQL/COBOL, ESQL/Java, ESQL/Fortran, etc. sont tous des produits standards. En principe toute requête SQL directe peut aussi être exécutée dans un programme. Réutilisation des langages existants Principe de préprocesseur. Exemple Pro*C precompiler de Oracle Najib Tounsi 4
EMBEDDED SQL Source ESQL/C Préprocesseur Code SQL pur Code C pur Processeur SQL Compilateur Plan d'exécution Module Objet Editeur de lien Module exécutable Najib Tounsi 5
Exemple simple ESQL/C Programme qui supprime de la base le produit "P2" main(){ EXEC SQL BEGIN DECALRE SECTION; char * SQLSTATE; EXEC SQL END DECALRE SECTION;... EXEC SQL DELETE FROM P WHERE P.NumP = 'P2';... if (SQLSTATE == '00000') printf ("%f\n", "Suppression OK"); else /* Erreur...*/ } A noter: l EXEC SQL pour distinguer lignes SQL pure. l SQLSTATE pour renseigner sur le déroulement de la requête. l Déclarée dans DECALRE SECTION. Najib Tounsi 6
2e Exemple simple ESQL/C Notion de variable C dans SQL, avec requête à tuple unique. main(){ EXEC SQL BEGIN DECALRE SECTION; char [5] xnump; float xprix; char * SQLSTATE; EXEC SQL END DECALRE SECTION; scanf("%s", xnump); /* ou autre source d'entrée */ EXEC SQL SELECT P.Prix INTO :xprix FROM P WHERE P.NumP = :xnump; if (SQLSTATE == '00000') printf ("%f\n", xprix); else /* Erreur...*/ } Najib Tounsi 7
A noter: l EXEC SQL pour distinguer lignes SQL pure. l Variables C particulières déclarées dans DECALRE SECTION. l SQLSTATE pour renseigner sur l'exécution de SQL l Requête mono-tuple ici! l Résultat récupéré dans variable C. Clause INTO. l SQLSTATE 00000 Succès 01xxx Warning particulier 02000 Succès mais résultat vide autres Exception SQL Najib Tounsi 8
3e Exemple simple ESQL/C Requête à résultat multi-tuples. Notion de CURSOR, avec instruction FETCH INTO pour extraire les valeurs retrouvées. SQLSTATE main(){ EXEC SQL BEGIN DECALRE SECTION; char [5] xnump; float xprix; char * SQLSTATE; EXEC SQL END DECALRE SECTION;... EXEC SQL DECLARE X CURSOR FOR SELECT P.Nump, P.Prix FROM P Order by Nump;... EXEC SQL OPEN X; EXEC SQL FETCH X INTO :xnump, :xprix; do while (SQLSTATE!= '02000'){ printf ("%s, %f\n", xnump, xprix); EXEC SQL FETCH X INTO :xnump, :xprix; }... EXEC SQL CLOSE X; } Najib Tounsi 9
A noter: l X est un curseur qui reçoit le résultat de l'expression SELECT. l X sera parcouru ligne par ligne, dans l'ordre pré défini par order by. l Ce sera EXEC SQL OPEN X qui exécutera la requête SELECT. l Après OPEN, FETCH retrouve une ligne et affecte les champs aux variables INTO. l FECTH en suite fait avancer le curseur vers la ligne suivante l FECTH doit donc apparaître à l'intérieur d'une boucle. l SQLSTATE 02000 est la valeur quand FECTH ne trouve plus de ligne? l... Najib Tounsi 10
SQL DYNAMIQUE Exemples précédents, requête SQL connue à l'écriture du programme. Cas où la requête n'est connue qu'au moment de l'exécution. Exemple: application ISQL! Tantque (existe requête utilisateur ) Saisir requête LDD / LMD exécuter requête Najib Tounsi 11
Exemple simple ESQL/C SQL DYNAMIQUE (1) Requête SQL connue à l'exécution. Notion de PREPARE et EXECUTE l Exemple 1: Exécution de SQL défini à l'exécution. A noter: EXEC SQL BEGIN DECLARE SECTION; char hostvarstmt[50]; EXEC SQL END DECLARE SECTION; strcpy(hostvarstmt, "DELETE FROM P WHERE Nump = 'P24'"); EXEC SQL PREPARE stmt FROM :hostvarstmt; EXEC SQL EXECUTE stmt; l PREPARE compile le contenu défini dans FROM, (comme si EXEC SQL PREPARE Stmt FROM "DELETE FROM P WHERE Nump = 'P24'") l et crée le plan d'exécution stmt, exécuté ensuite par SQL EXECUTE. l Aspect dynamique: La requête entrée au clavier (ou provient de menu...) scanf("%s", hostvarstmt); EXEC SQL PREPARE stmt FROM :hostvarstmt; EXEC SQL EXECUTE stmt; Najib Tounsi 12
Exemple simple ESQL/C SQL DYNAMIQUE (2) l Cas particulier: On peut faire PREPARE et EXECUTE en une seule instruction EXECUTE IMMEDIATE strcpy(stmt, "CREATE TABLE matable( macolonne INTEGER)"); EXEC SQL EXECUTE IMMEDIATE :stmt; l Sauf pour SELECT. l Pour INTO, comment savoir le nombre, le nom et le type des colonnes retournées? l Pour plusieurs lignes, on utilise CURSOR et FETCH. l Usage de DESCRIBE sur le résultat de PREPARE Najib Tounsi 13
Exemple simple ESQL/C SQL DYNAMIQUE l DESCRIBE offre structure (SQL Dynamic Area, SQLDA) permettant de connaître: (Schéma simplifié) l SQLN Nombre de valeurs dans SQLVAR (nombre de colonnes). Retourné par PREPARE, utilisé par DESCRIBE l SQLDABC (Taille du SQLDA) l SQLD (nombre de colonne retrouvées) l SQLVAR ( Tableau descriptif des colonnes retrouvées) l SQLTYPE (code pour le type d'une colonne) l SQLLEN (Taille d'une colonne) l SQLNAME (Nom d'une colonne) Najib Tounsi 14
Exemple simple ESQL/C squelette de SELECT DYNAMIQUE (3) EXEC SQL BEGIN DECLARE SECTION; char stmt1_str[200]; EXEC SQL END DECLARE SECTION; EXEC SQL INCLUDE SQLDA; EXEC SQL DECLARE DYN_CURSOR CURSOR FOR STMT1_NAME; /* reference en avant */ /* code pour avoir une requête SELECT */ EXEC SQL PREPARE STMT1_NAME FROM :stmt_str; /* tester SQLN pour allouer SQLDA */ EXEC SQL DESCRIBE STMT1_NAME INTO :sqlda; /* Verifier si SQLN == SQLD (il n'y a pas de LOB) /* code pour utiliser SQLDA... */ EXEC SQL OPEN DYN_CURSOR;... /* boucle d'accès aux données... */ EXEC SQL FETCH DYN_CURSOR USING DESCRIPTOR :sqlda;.etc. Najib Tounsi 15
SQL et Langages de programmation : Couplage «fort» Exemple de PL/SQL Voir : TP. Najib Tounsi 16