IntroSQL Base
IntroSQL Base
Sommaire
1 - Présentation ; objectifs..................................................................................3
2 - Qu'est-ce que SQL ?.....................................................................................3
3 - Comment est construite une instruction SQL ?.............................................4
4 - Conventions d'écriture pour les règles de syntaxe........................................5
5 - Comment écrire une instruction SQL en Basic ?..........................................5
6 - Quelques instructions SQL ..........................................................................6
6.1 - L'instruction INSERT.........................................................................................6
6.2 - L'instruction SELECT........................................................................................8
6.3 - L'instruction UPDATE.....................................................................................10
6.4 - L'instruction DELETE.....................................................................................10
6.5 L'instruction CREATE.......................................................................................11
6.6 - L'instruction DROP.........................................................................................11
6.7 - L'instruction ALTER TABLE............................................................................11
6.8 - Les instructions COMMIT, ROLLBACK et SAVEPOINT et les
TRANSACTIONS....................................................................................................12
7 - Les fonctions et procédures intégrées dans HSQLDB................................13
7.1 - Fonctions d'agrégation....................................................................................13
7.2 - Fonctions et procédures numériques.............................................................13
7.3 - Fonctions et procédures pour les chaînes de caractères..............................13
7.4 - Fonctions et procédures pour les dates et les heures....................................13
7.5 - Autres fonctions et procédures.......................................................................13
8 - Les ALIAS...................................................................................................14
9 - Bibliographie...............................................................................................14
10 - Crédits ......................................................................................................15
11 - Licence......................................................................................................15
1 - Présentation ; objectifs
La suite bureautique libre OpenOffice.org comporte un langage de programmation appelé
OpenOffice Basic (Ooo Basic), qui permet d' écrire des macros pour automatiser les tâches dans
les divers modules de cette suite. Un de ces modules, appelé Base (gestion des bases de
données) sert d'interface utilisateur (de client) à une base de données externe, ou à la base
intégrée HSQLDB. Une façon de communiquer avec cette base de données est d'utiliser le
langage SQL à travers OOo Basic. Il faut cependant pour cela connaître les deux langages en
question ! On peut d'ailleurs utiliser d'autres langages (Python, Java, ...).
On pourra apprendre OOo Basic dans l'aide intégrée, avec divers tutoriels disponibles en ligne
(par exemple voir http://wiki.services.openoffice.org/wiki/Extensions_development_basic_fr) , ou
encore en consultant le livre « Programmation OpenOffice.org 2 » [Marcelly et Godard, 2005]
(voir Bibliographie). Le présent document essaie de répondre aux questions de base que se pose
le débutant lorsqu'il essaie d'intégrer le langage SQL dans ses macros. Ce n'est qu'une initiation,
qu'on utilisera avant de passer à des ouvrages plus complets. En particulier, on consultera le
chapitre 9 du HSQLDB User Guide [HSQLDB Development Group] consacré à la syntaxe. On
pourra aussi trouver divers cours sur le langage SQL sur Internet. Voir laBibliographie.
Ce document concerne l'utilisation de la base intégrée HSQLDB, même si beaucoup
d'informations peuvent être valables avec d'autres systèmes de base de données. L'essentiel
devrait être adaptable à d'autres langages que OOo Basic (il faudra en particulier adapter la
manière de spécifier les chaînes de caractères).
Si on veut exécuter des commandes SQL directement, on consultera le document « FAQ Base
intégrée et requêtes SQL directes» écrit par Manuel Naudin [Naudin, 2006].
Une expression peut avoir divers types : des nombres (la virgule sera remplacée par un point :
3.1415926), des chaînes de caractères (encadrées par des apostrophes : 'Ceci est une
chaine'), des comparaisons (avec les signes =, <, <=, >, >=, !=) des calculs (avec les
signes +, -, /, *), etc.
Les dates et les heures seront aussi mises entre apostrophes, aux formats 'AAAA-MM-JJ' et
'HH:MM:SS'. Il existe aussi le type TIMESTAMP ou DATETIME, représentant une date et une
heure ensemble, représentées par le format'AAAA-MM-JJ hh:mm:ss.sssssssss'
Pour les booléens, on utilisera TRUE ou FALSE (sans apostrophes). Il est déconseillé d'utiliser 1
ou 0 (plus tard, vous souviendrez-vous ce qu'ils signifient?)
Remarque : ceci est assez simplifié, mais suffisant la plupart du temps.
En OOo Basic, supposons que les valeurs à mettre dans les trois champs ci-dessus soient reçus
dans des variables, on écrira le code suivant:
Dim iID As Integer, sNom As String, sPrenom As String
Dim dAvoir As Integer
Dim sInstrSQL As String, sSavoir As String
REM Ici on déterminera les valeurs à donner aux variables
iID = 45
sNom = "Dupont"
sPrenom = "Pierre"
dAvoir = 152
REM Dans la pratique ces valeurs pourraient par exemple être
REM récupérées dans une boîte de dialogue
sInstrSQL = "INSERT INTO ""Clients"" (""ID"", ""Nom"",
""Prenom"""
sInstrSQL = sInstrSQL & ", ""Avoir"" ) VALUES ( "
sInstrSQL = sInstrSQL & iID & ", '" & sNom & "', '"
sInstrSQL = sInstrSQL & sPrenom & "', " & dAvoir & " )"
REM Notez les apostrophes qui encadrent les chaines de
caractères
' MsgBox ( sInstrSQL ) ' pour la mise au point
On remarquera les doubles guillemets (pour que OOo Basic ne croie pas qu'il s'agit de la fin de
la chaîne), et les apostrophes qui encadrent les valeurs des variables chaînes.
L'instruction MsgBox nous donnera la chaîne de caractères qui sera transmise ensuite à SQL:
INSERT INTO "Clients" ("ID", "Nom", "Prenom", "Avoir" ) VALUES ( 45,
'Dupont ', 'Pierre', 152.5)
Supposez maintenant que dAvoir ait été défini comme Double (ce qui est plus réaliste, car il
peut y avoir des centimes) :
dAvoir = 152.5
Le programme ci-dessus ne marchera pas ; en effet, la transformation (implicite) en chaîne de de
caractères mettra une virgule. Or, pour transmettre un nombre décimal, il faut veiller à remplacer
la virgule par un point ; pour cela, on peut utiliser la fonctionVirgToPoint :
sAvoir = VirgToPoint ( dAvoir )
Autre petit problème : supposez qu'un jour nous ayons à introduire un client dont le nom serait
«Dumont d'Urville», avec une apostrophe dans le nom. Comme l'apostrophe est reconnue par
HSQLDB comme délimiteur de chaîne de caractères, notre bout de programme ci-dessus ne
marchera pas et nous aurons un message d'erreur nous indiquant que Urville n'est pas reconnu.
Comment faire ? Tout simple : avant l'utilisation d'une chaîne de caractères, doubler les
apostrophes internes à la chaîne. Pour cela on peut procéder ainsi:
sNom = DbleApostr(sNom)
avec :
Function DbleApostr ( sEntree As String ) As String
Dim lLongueur As Long, sChar As String
Dim sSortie As String, i As Long
lLongueur = Len ( sEntree )
sSortie = ""
For i = 1 to lLongueur
sChar = Mid ( sEntree, i, 1 )
If sChar = "'" then
sChar = "''"
End If
sSortie = sSortie & sChar
Next i
DbleApostr = sSortie
End Function
Les dates seront mises au bon format, différent du format normal de OooBasic. Là encore, une
fonction de conversion sera utile:
Function ConvDate (sEntree As String) As String
ConvDate = Right(sDate, 4) & "-" & Mid(sDate, 4, 2) & "-" & _
Left(sDate, 2) & "'"
End Function
Concernant les les booléens, on enverra les valeurs TRUE (pour vrai) et FALSE (pour faux) (sans
apostrophes !). On peut aussi utiliser respectivement-1 et 0.
Tout cela sera valable pour toutes les instructions qui transmettront des chaînes de caractères,
des nombres, des dates, des booléens, .. Ce peut être une valeur à écrire dans une table
(instructions INSERT ou UPDATE), mais aussi pour créer une expression (pour une recherche par
l'instruction SELECT, ou pour un calcul).
Pour trouver facilement la syntaxe des requêtes SQL, on peut créer la requête dans l'assistant ;
quand la requête est testée et fonctionne correctement, on désactive l'affichage de l'assistant
(Requête => Modifier puis Affichage => (Dés)activer le mode Ébauche)
La manière de récupérer le résultat de la requête dans Basic est expliquée au chapitre 17 du livre
« Programmation OpenOffice.org 2 ». Sans faire double emploi avec le livre, voici un aperçu de la
méthode :
Sub ObtenirResultatRequete
Dim oRequete As Object, oResultat As Object
Dim sInstrSQL As String
Dim bOK As Boolean
ConnecterSource
sInstrSQL = "SELECT ""Nom"" FROM ""Clients"" WHERE ""ID"" <=
12"
oRequete = oMaConnexion.createStatement()
oResultat = oRequete.executeQuery( sInstrSQL )
bOK = oResultat.next ' accès à la première ligne
If bOK then
MsgBox oResultat.Columns.getByName("Nom").String
else
MsgBox "Problème à l'exécution !"
End if
End Sub
L'objet oResultat contient l'ensemble des ligne correspondant à la requête. On y accède ligne
par ligne (enregistrement par enregistrement). On peut se déplacer dans cet ensemble par les
méthodes first, last, next, previous, Bookmark(vSignet) (pour mémoriser une position
dans la variable vSignet), moveToBookmark, moveRelativeToBookmark. On peut tester la
position où on se trouve par les méthodesisFirst, isLast, isBeforeFirst, isAfterLast.
Attention donc à ce genre d'instruction. Faites des sauvegardes de vos tables avant de faire vos
essais.
Si on utilise la clause BEFORE le champ sera ajouté à l'emplacement indiqué, sinon il sera ajouté
à la fin. Exemple :
ALTER TABLE "Clients" ADD "Titre" VARCHAR(5) BEFORE "Nom"
Une autre forme de cette instruction, permettant cette fois de supprimer un champ existant:
ALTER TABLE <table> DROP [COLUMN] <NomDeChamp>
Exemple :
ALTER TABLE "Clients" DROP "Titre"
Ainsi, avec ces deux formes de l'instruction ALTER TABLE, on peut ajouter et supprimer des
champs dans les tables.
Une base de données est généralement accessible à plusieurs utilisateurs en même temps.
Supposez une base de données pour gérer les places d'avion. S'il reste une seule place dans
l'avion et que 2 utilisateurs se connectent en même temps sur la base, comment être sûr que les
deux ne vont pas la réserver ? Il faut pour cela une technique appelée « transaction » : le
premier qui se connecte commence une transaction, et toutes les instructions qui vont suivre
seront considérées comme une instruction unique et indivisible ; ainsi, le second utilisateur ne
pourra pas réserver avant que la transaction du premier soit terminée, et à ce moment il recevra
l'information qu'il n'y a plus de places.
Pour réaliser cela, on utilise les instructions COMMIT et ROLLBACK, mais il faut avant cela une
instruction SET AUTOCOMMIT FALSE (qu'on devra effectuer indirectement ; voir le Hsqldb User
Guide (Bibliographie), ceci sortant du cadre de cette initiation).
Voir aussi au sujet des transactions un excellent article (« A quoi ça sert ??? ») sur le site
Developpez.com, à l'adresse http://sql.developpez.com/sqlaz/techniques/
Remarque
La description de ces instructions est volontairement simplifiée et ne donne qu'une petite partie
des possibilités qu'offre le langage SQL et le moteur de base de données HSQLDB. De plus, il
existe bien d'autres instructions SQL (moins utilisées), qu'on trouvera dans le Hsqldb User Guide
(Bibliographie). Cependant il n'est pas certain que toutes fonctionnent avec OOo Basic ; il faudra
donc faire des essais
8 - Les ALIAS
On peut demander à recevoir la valeur d'un champ sous un « alias » (un nom d'emprunt). Le
mot-clef est AS.
Une utilisation possible est de faire afficher le nom du champ en français alors que le nom
d'origine est en langue étrangère, ou peu explicite:
SELECT "ZipCode" AS "CodePostal" FROM "Adresses"
On l'utilise aussi pour pouvoir accéder à un résultat d'un calcul (c'est la seule manière d'y
parvenir) :
SELECT "Prenom" || ' ' || "Nom" AS "NomComplet" FROM "Clients"
SELECT SUM ("Quantite" * "Prix" ) AS "Montant" FROM "Commandes" WHERE
"ID" = 147
9 - Bibliographie
GAGNEUX, Benjamin, DUBOIS, Frédéric, et al., Cours SQL dans « Developez.com - Club
d'entraide des développeurs francophones », 2004, disponible à l'adresse
http://sql.developpez.com/
HSQLDB Development Group, « Hsqldb User Guide », disponible en ligne aux adresses :
http://hsqldb.org/web/hsqlDocsFrame.htmlou http://hsqldb.sourceforge.net/doc/guide/
MARCELLY, Bernard et GODARD, Laurent, « Programmation OpenOffice.org 2 », Eyrolles,
Paris, 2005, 724 pages
NAUDIN, Manuel, « FAQ Base intégrée et requêtes SQL directes », 2006, disponible avec
d'autres tutoriels à l'adresse : http://fr.openoffice.org/Documentation/How-to/indexht-base.html
Wiki OpenOffice.org, site de de ressources pour développeurs d'OpenOffice.org, en anglais et
aussi pour partie en français,disponible à l'adresse :
http://wiki.services.openoffice.org/wiki/Extensions_development_basic_fr
10 - Crédits
Auteur : Louis Vidonne
Remerciements : à Manuel Naudin, Jean-François Nifenecker et Jean-Louis Argente pour leurs
remarques et suggestions pertinentes
Intégré par : Tony Galmiche
Contacts : Projet Documentation OpenOffice.org -fr.OpenOffice.org
Traduction :
11 - Licence
Appendix
The contents of this Documentation are subject to the Public Documentation License
Version 1.0 (the "License"); you may only use this Documentation if you comply with the terms of this
License. A copy of the License is available athttp://www.openoffice.org/licenses/PDL.html.
Contributor(s): ______________________________________.
Portions created by ______ are Copyright©_________[Insert year(s)]. All Rights Reserved.
(Contributor contact(s):________________[Insert hyperlink/alias]).