CHAPITRE UN Bases de SQL Hacks 1-6 Même les commandes SQL les plus simples peuvent comporter des variantes curieuses ; ce chapitre vous montrera qu un programmeur astucieux peut exploiter les nombreuses subtilités du langage. En maîtrisant mieux SQL, vous pouvez effectuer plus de traitements au niveau de la base de données et décharger d autant le code de votre application. Cette meilleure distribution du travail profite à la fois à la base et à votre programme. Elle permet également de réduire le trafic entre les deux. En outre, l amélioration de votre code SQL facilite la relecture de vos requêtes. Tous les principaux SGDBR du marché disposent d une interface en ligne de commande. Ces interfaces, bien qu apparemment rustiques, sont des outils essentiels pour tous les hackers SQL. Chacune a ses propres particularités, mais elles fournissent à peu près les mêmes fonctionnalités. Nous étudierons celles de SQL Server, Oracle, MySQL, Access, DB2 et PostgreSQL dans le premier hack, «Utiliser SQL à partir de la ligne de commande». H A C K Utiliser SQL à partir de la ligne de commande Hack Bien que l interface en ligne de commande constitue le strict minimum pour exécuter des commandes SQL, vous apprécierez sa présence en de nombreuses occasions. Tous les SGBDR les plus connus (sauf Access) disposent par défaut d outils en ligne de commande qui fournissent globalement les mêmes services : Vous pouvez taper du code SQL et voir immédiatement le résultat ou les messages d erreur. Vous pouvez les lancer à partir de l invite du système d exploitation. Vous pouvez préciser le nom d utilisateur et le mot de passe que vous souhaitez utiliser. Vous pouvez récupérer par un pipe les instructions SQL à partir d un autre processus. Chapitre 1 Bases de SQL 1
HACK Utiliser SQL à partir de la ligne de commande La souplesse de ces outils est idéale pour exécuter des instructions SQL ad hoc ou pour développer et tester les requêtes avant de les intégrer aux applications. Les exemples de ce hack se connectent à la base de données nombase sur localhost, sous le compte de l utilisateur scott avec le mot de passe tiger. Pipe vers SQL Un pipe (abréviation de «pipeline») permet d enchaîner une suite de commandes, de sorte que la sortie de l une devienne l entrée de la suivante. Les pipes sont disponibles à la fois dans la fenêtre de commandes de Windows et dans le shell de Linux/Unix. Vous pouvez donc appeler l interface SQL en ligne de commande à la fin d un pipe afin d y injecter le résultat de la commande précédente, lequel sera alors traité comme du code SQL. Une opération classique, par exemple, consiste à utiliser un pipe pour envoyer une suite d instructions INSERT à l interface SQL en ligne de commande. L exemple suivant s exécute dans une fenêtre de commandes de Windows, mais fonctionne également à l invite d un shell Unix. La commande doit être tapée sur une seule ligne. Avec Unix ou Linux, vous pouvez la décomposer en plusieurs lignes en plaçant un caractère \ (le caractère de continuation de ligne) avant la coupure de ligne : C:>perl -pe "s/date //g;" < cmnd.sql sqlcmd -U scott -P tiger -d nombase -n (1 row affected) (1 row affected) Ce code lit le fichier de commandes SQL cmnd.sql et redirige ses lignes dans un script Perl à l aide de l opérateur <. La sortie de ce script est ensuite envoyée via un pipe à la commande sqlcmd. Le fichier cmnd.sql contient les instructions SQL suivantes : INSERT INTO test(d, txt) VALUES (DATE '2007-01-01','ligne un'); INSERT INTO test(d, txt) VALUES (DATE '2007-01-02','ligne deux'); Ces entrées ne peuvent être exécutées telles quelles car les dates littérales reconnues par SQL Server doivent être de la forme '2007-01-01' au lieu de DATE '2007-01-01'. Le script Perl a donc pour but de supprimer le mot-clé DATE des lignes de cmnd.sql. Options Pour utiliser l interface SQL en ligne de commande, vous devez savoir employer ses options. Dans l exemple ci-dessus, nous avons précisé le nom d utilisateur et le mot de passe à l aide des options U et P ; sans elles, les deux premières lignes du fichier cmnd.sql auraient été considérées comme le nom de l utilisateur et le mot de passe. Il convient également de préciser avec l option d le nom de la base de données à laquelle on souhaite se connecter ; sinon, il faut ajouter les lignes use nombase et go au début du fichier de commandes. L option -n, quant à elle, sert à supprimer l invite >1 qui apparaît normalement lorsque l on utilise sqlcmd de façon interactive.
Utiliser SQL à partir de la ligne de commande HACK Microsoft SQL Server L interface SQL en ligne de commande s appelle sqlcmd (ou osql sur les anciens systèmes). Vous devez soit utiliser l option U pour préciser le nom d utilisateur, soit l option E pour indiquer que vous utilisez l authentification de Windows. Pour disposer d une copie personnelle de SQL Server, utilisez sa version SQL Server Express, que vous pouvez télécharger gratuitement à partir de la page http://msdn.microsoft.com/vstudio/ express/sql. Une particularité de sqlcmd est que cet outil exige que vous entriez le mot GO après chaque commande (un GO implicite est produit à la fin du fichier lorsqu on l exécute en mode batch, comme dans notre exemple). Vous pouvez modifier la ligne courante et utiliser les flèches haut et bas du curseur pour parcourir l historique des commandes. Voici quelques tâches courantes que l on peut réaliser avec sqlcmd : Se connecter à SQL Server Cette commande devrait fonctionner avec la plupart des installations de SQL Server : C:> sqlcmd U scott P tiger Si vous utilisez la version Express de SQL Server ou une version qui vous a été offerte en même temps que des outils de développement, vous devez préciser un nom d instance. Avec la version Express, par exemple, l instance par défaut s appelle SQLEXPRESS (notez également l utilisation de l option -E pour bénéficier de l authentification intégrée, qui est la configuration par défaut de SQL Server Express) : C:> sqlcmd E S (local)\sqlexpress Si vous avez obtenu SQL Server avec un produit comme Visual Studio, consultez la documentation. Obtenir la liste des tables Pour connaître les tables disponibles dans une base de données, lancez ces commandes à partir de sqlcmd : 1> use nombase 2> GO Changed database context to 'nombase'. 1> sp_help 2> GO Dans une fenêtre de commandes de 80 24, le format du résultat de sp_help est difficile à lire. La requête suivante sera donc sans doute plus utile : 1> SELECT name FROM sysobjects WHERE type='u' 2> GO Chapitre 1 Bases de SQL 3
HACK Utiliser SQL à partir de la ligne de commande Importer un fichier SQL dans SQL Server La commande suivante utilise l option i pour importer le fichier fichier.sql : Oracle C:> sqlcmd U scott d nombase i c:\fichier.sql L interface en ligne de commande d Oracle s appelle SQL*Plus et est accessible via le programme sqlplus exécutable à l invite du système d exploitation. Se connecter à Oracle La commande suivante permet de se connecter à Oracle : $ sqlplus scott/tiger Obtenir la liste des tables Pour connaître les tables disponibles, utilisez la commande : SQL> SELECT * FROM cat; sqlplus a tendance à afficher des colonnes larges, ce qui rend les résultats difficiles à lire, même pour une vue de deux colonnes comme cat. Si vous connaissez leurs noms, vous pouvez préciser les largeurs des colonnes qui seront utilisées au cours de la session. Les deux colonnes de la vue cat s appellent _NAME et _ TYPE : SQL> COL table_name FORMAT a20; SQL> COL table_type FORMAT a20; SQL> SELECT * FROM cat; _NAME _TYPE -------------------- -------------------- AGENCY_TRADE AGENCY_TRADE1 INCORRECT beatles CORRECT TMP EMP_VIEW VIEW EMPVIEW VIEW SUITOR HAS Importer un fichier SQL dans Oracle Utilisez la commande start à l invite de sqlplus. Utilisez d abord la commande SET DEF OFF pour éviter que les éventuelles esperluettes (&) contenues dans le fichier ne posent problème : SQL> SET DEF OFF; SQL> START fichier.sql Une autre approche consiste à utiliser la commande @, qui ajoute automatiquement l extension.sql au nom du fichier : @fichier
Utiliser SQL à partir de la ligne de commande HACK MySQL L interface en ligne de commande de MySQL est un plaisir à utiliser. Vous pouvez vous servir de la touche haut du curseur pour rappeler les commandes précédentes et les résultats s affichent de façon lisible. Cette interface dispose d un grand nombre d options permettant de modifier le comportement par défaut du client : la commande mysql --help en décrit certaines. Se connecter à MySQL Utilisez la commande : $ mysql uscott ptiger nombase Obtenir la liste des tables Utilisez la commande show tables : $ mysql -uscott -ptiger nombase Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 39097 to server version: 5.0.18-standard Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> show tables; +------------------+ Tables_in_nombase +------------------+ Perm Table1 atoa access_log actor Importer un fichier SQL dans MySQL La commande source lit et exécute un fichier d instructions SQL : mysql> source fichier.sql Query OK, 0 rows affected (0.01 sec) Query OK, 1 row affected (0.00 sec) Access Bien que, le plus souvent, les utilisateurs d Access ne se servent que de l interface graphique pour écrire leurs requêtes et gérer la base, vous pouvez également écrire du code SQL plus ou moins standard pour interroger la base, créer des tables, etc. Si vous ne savez pas faire une certaine opération avec l interface graphique, utilisez directement une requête SQL pour la réaliser. Chapitre 1 Bases de SQL 5
HACK Utiliser SQL à partir de la ligne de commande Se connecter à Access Pour disposer de l interface SQL, vous devez d abord créer une nouvelle requête à partir du panneau de la base de données. Si une boîte de dialogue «Show Table» surgit pendant cette opération, fermez-la sans rien sélectionner. Lorsque vous avez créé et ouvert une requête, choisissez «SQL View» dans le menu «View», comme le montre la figure 1-1. Access reconnaît la plupart des instructions définies dans la norme SQL, notamment toutes les commandes CREATE et DROP ; il permet également d utiliser des sous-requêtes. Choisissez «Requête Exécuter» pour exécuter la requête que vous avez tapée dans la fenêtre de visualisation SQL. Si votre requête doit produire un résultat (une instruction SELECT, par exemple), vous devrez choisir «Vue Vue SQL» pour retourner à la fenêtre SQL. Figure 1-1. Fenêtre SQL d une requête Importer un fichier SQL Access ne dispose pas de cet outil essentiel, mais vous pouvez effectuer cette opération à l aide de quelques lignes de Visual Basic : DoCmd.SetWarnings False Open "c:\ch01access.sql" For Input As 1
Utiliser SQL à partir de la ligne de commande HACK Dim sql As String Dim txt As String While Not EOF(1) Line Input, txt sql = sql & txt & vbcrlf If Len(txt) > 0 And Right(txt, 1) = ";" Then DoCmd.RunSQL sql sql = "" End If Wend Close 1 Pour que ce code s exécute, placez-le dans un gestionnaire d événements : celui associé à l événement «On Click» d un bouton, par exemple. Si un fichier.mdb a été configuré pour cacher le panneau de la base de données et lancer automatiquement un autre formulaire, pressez la touche majuscules avant de double-cliquer sur ce fichier : cela annulera ce comportement. Pour que la touche majuscules ne puisse pas fonctionner de cette façon, créez la base de données sous la forme d un fichier.mde. PostgreSQL Pour travailler avec PostgreSQL à partir de la ligne de commande, utilisez l outil psql. Se connecter à PostgreSQL L interface en ligne de commande de PostgreSQL s appelle psql. Vous pouvez utilisez les flèches haut et bas du curseur pour naviguer dans l historique des commandes. En outre, les longs résultats s affichent automatiquement page par page, à la façon de la commande more : $ psql -d nombase -U scott Obtenir la liste des tables Pour afficher les noms des tables, utilisez la commande \dt (directory of tables). La commande \? affiche la liste des commandes disponibles : $ psql -d nombase -U scott Password: Welcome to psql 7.3.2, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \' to quit nombase=> \dt Chapitre 1 Bases de SQL 7
HACK Utiliser SQL à partir de la ligne de commande List of relations Schema Name Type Owner --------+-------------------------------+-------+------- public INT public TBL_CALLS public a public a1 public a401478 public a_test public aaa public aad_casos_especiales Certaines commandes \ attendent des options. La liste suivante ne montre que les premières commandes : nombase=> \? \a toggle between unaligned and aligned output mode \c[onnect] [DBNAME - [USER]] connect to new database (currently "nombase") \C [STRING] set table title, or unset if none \cd [DIR] change the current working directory \copy... perform SQL COPY with data stream to the client host \copyright show PostgreSQL usage and distribution terms \d [NAME] describe table, index, sequence, or view \d{t i s v S} [PATTERN] (add "+" for more detail) list tables/indexes/sequences/views/system tables \da [PATTERN] list aggregate functions \dd [PATTERN] show comment for object \dd [PATTERN] list domains \df [PATTERN] list functions (add "+" for more detail) Importer un fichier dans PostgreSQL Pour importer un fichier de commandes SQL, utilisez la commande \i : nombase=> \i fichier.sql DB2 L interface en ligne de commande de DB2 s appelle db2. N utilisez pas de pointsvirgules pour séparer les instructions SQL. L analyseur syntaxique de db2 est étonnant. Il n a pas besoin de séparateurs d instructions et il semble accepter quasiment n importe quoi pour les noms de table ou de colonne. Vous pouvez ainsi créer une table nommée from contenant des colonnes nommées select et from sans que cela ne perturbe l analyseur. Imaginez la puissance qu il doit avoir pour interpréter correctement cette requête :
Utiliser SQL à partir de la ligne de commande HACK SELECT FROM FROM FROM SELECT FROM FROM FROM FROM SELECT 'FROM' FROM FROM, \ FROM FROM SELECT 'FROM' FROM FROM FROM, FROM FROM SELECT FROM MORF FROM \ FROM MORF Cela dit, ce n est pas forcément une bonne idée d utiliser ces noms. L authentification et les autorisations de la base de données peuvent utiliser celles du système d exploitation, ce qui évite de devoir saisir un nom d utilisateur et un mot de passe : $ db2 (c) Copyright IBM Corporation 1993,2002 Command Line Processor for DB2 SDK 8.1.2 You can issue database manager commands and SQL statements from the command prompt. For example: db2 => connect to sample db2 => bind sample.bnd For general help, type:?. For command help, type:? command, where command can be the first few keywords of a database manager command. For example:? CATALOG DATABASE for help on the CATALOG DATABASE command? CATALOG for help on all of the CATALOG commands. To exit db2 interactive mode, type QUIT at the command prompt. Outside interactive mode, all commands must be prefixed with 'db2'. To list the current command option settings, type LIST COMMAND OPTIONS. For more detailed help, refer to the Online Reference Manual. db2 => connect to nombase Database Connection Information Database server = DB2/LINUX 8.1.2 SQL authorization ID = ANDREW Local database alias = NOMBASE db2 => list tables Table/View Schema Type Creation time ------------------------ --------------- ----- -------------------------- TEST1 ANDREW T 2006-07-17-14.13.35.844330 1 record(s) selected. Chapitre 1 Bases de SQL 9
HACK #2 Se connecter à une base de données à partir d un programme Importer un fichier SQL Utilisez le programme db2batch pour importer un fichier de commandes SQL dans DB2. H A C K #2 Se connecter à une base de données à partir d un programme Hack Vous pouvez accéder aux bases de données SQL à partir de la plupart des langages de programmation, comme Perl, PHP, Ruby, Java et C#. #2 Manipuler une base de données à partir d un langage de programmation passe généralement par une connexion à la base et par l utilisation d un curseur. Pour chaque langage présenté, nous expliquerons comment effectuer les opérations suivantes : Connexion au serveur Vous devez indiquer l emplacement du serveur et le nom de la base de données, ainsi qu un nom d utilisateur et un mot de passe. Vous obtenez en retour un descripteur de connexion qui représentera cette connexion et qui sera utilisé par les commandes SQL que vous réaliserez ensuite. Cette tentative de connexion peut produire une erreur si le serveur n est pas disponible ou si l authentification a échoué, par exemple. Exécution d une instruction SELECT Lorsque vous envoyez cette instruction SQL au serveur en vous servant du descripteur de connexion, vous obtenez un curseur. Cette tentative peut également échouer si, par exemple, l instruction SELECT contient une erreur de syntaxe ou si vous n avez pas les permissions requises. Récupération des données Généralement, cela consiste à parcourir les données obtenues par la requête jusqu à ce que le curseur indique que tout l ensemble a été parcouru. À chaque itération, le curseur pointe vers une ligne de données et vous pouvez donc récupérer les différents champs de cette ligne avant de passer à la ligne suivante. Habituellement, cette étape ne provoque pas d erreur, bien qu un problème de réseau au milieu d un traitement puisse poser problème, par exemple. Fermeture du curseur, puis de la connexion Ces opérations doivent être réalisées lorsque vous avez fini d effectuer les requêtes et que vous souhaitez vous déconnecter de la base de données. Ce cycle est un compromis raisonnable entre les aspects pratiques et les performances mais il peut être décliné selon de nombreuses variantes. Si le volume des données n est pas trop important, vous pouvez, par exemple, stocker en une seule opération toutes ces données dans une structure en mémoire.