1 Présentation
2 Comment exécuter des requêtes SQL directement sous Base ?
3 Comment saisir une requête SQL ?
4 Au secours, OOo modifie mes requêtes !
5 Quelles sont les commandes SQL supportées en mode requête SQL direct ?
6 Comment exécuter d'autres commandes SQL que SELECT ?
7 Quelles sont les fonctions et procédures intégrées supportées ?
8 Les fonctions intégrées retournent des valeurs NULL
9 Les regroupements renvoient des messages d'erreur
10 Annexes
101 Création de la table servant aux exemples de requêtes
102 Export de la structure et des données d'une base intégrée
11 Crédits
12 Licence
1 Présentation
Ce document est destiné aux utilisateurs d'OpenOffice.org 2 désirant exécuter des requêtes SQL en mode direct, sans utiliser les aides apportées par le mode ébauche de requêtes. De plus, il est concentré sur l'exploitation d'une base intégrée Hsqldb, même si certaines informations peuvent être valables avec d'autres systèmes de base de données.
2 Comment exécuter des requêtes SQL directement sous Base ?
Base permet d'exécuter des requêtes SQL directement, sans interprétation par Base. Pour utiliser ce mode, il faut cliquer sur l'icône «Requêtes » de la colonne « Base de données », puis menu Insérer > Requête (mode SQL). Une fenêtre d'édition de requête s'ouvre à partir de laquelle vous pourrez saisir, exécuter et sauvegarder des requêtes SQL.
Activez l'option SQL direct par le menu Éditer > Exécuter directement l'instruction SQL. Dans ce mode, vous ne pouvez plus utiliser le mode Ébauche, mais vous êtes sûr que OOo ne modifie pas votre requête et l'envoie directement à Hsqldb.
Pour exécuter la requête saisie, sélectionnez le menu Éditer > Exécuter la requête. La zone d'édition des requêtes se scinde alors en deux pour afficher le résultat de la requête.
3 Comment saisir une requête SQL ?
Les noms de tables et de champs peuvent être saisis sans guillemet ou bien entourés de guillemets doubles :
SELECT NOM FROM CLIENTS
est valide , ainsi que
SELECT "NOM" FROM "CLIENTS"
Néanmoins, les guillemets doubles sont obligatoires lorsque les noms comportent des caractères spéciaux ou accentués, ou des espaces. J'utiliserai donc les guillemets doubles dans ce document.
Si vous utilisez les guillemets doubles, les espaces ne sont pas obligatoires :
SELECT"NOM"FROM"CLIENTS"
Le point virgule en fin de requête n'est pas nécessaire.
Les nombres passés en paramètre sous forme littérale ne sont encadrés d'aucun guillemet :
SELECT * FROM "CLIENTS" WHERE "ID_CLIENT" = 1
ou bien (pour les nombres décimaux, c'est le point (.) qui sert de séparateur) :
SELECT * FROM "PRODUITS" WHERE "PX_UNITAIRE" = 7.65
Les chaînes de caractères passées en paramètre sous forme littérale sont encadrées de guillemets simples :
SELECT "ID_CLIENT" FROM "CLIENTS" WHERE "NOM" = 'gautier'
Les dates passées en paramètre sous forme littérale sont encadrées de guillemets simples et doivent être au format AAAA-MM-JJ :
SELECT "ID_CLIENT" FROM "CLIENTS" WHERE "DATE_CREA" < '2006-02-01'
Les heures passées en paramètre sous forme littérale sont encadrées de guillemets simples et doivent être au format HH:MM:SS.
Les booléens passés en paramètre sous forme littérale sont de la forme 0 pour FALSE ou autre entier pour TRUE :
SELECT * FROM "COMMANDES" WHERE "VALID_LIVRAISON" = 1
Vous pouvez également utiliser TRUE ou FALSE :
SELECT * FROM "COMMANDES" WHERE "VALID_LIVRAISON" = TRUE
4 Au secours, OOo modifie mes requêtes !
Vous avez saisi une requête dans la fenêtre requête SQL :
SELECT "NOM" FROM "CLIENTS"
Vous sauvegardez, vous fermez, et lorsque vous voulez éditer cette requête, c'est l'éditeur en mode ébauche qui s'ouvre. Si vous désactivez le mode ébauche, votre requête se présente ainsi:
SELECT "NOM" FROM "CLIENTS" "CLIENTS"
Le nom de la table est désormais répété deux fois. C'est probablement que vous avez désactivé l'option SQL direct lors de la sauvegarde précédente, et OOo a retravaillé la requête. La requête ainsi modifiée s'exécute normalement, mais la lecture n'est pas facilitée.
5 Quelles sont les commandes SQL supportées en mode requête SQL direct ?
Il semble que la seule commande SQL supportée dans le mode requête SQL direct soit la commande SELECT telle qu'elle est définie dans la documentation Hsqldb (disponible en ligne à l'adresse ).
6 Comment exécuter d'autres commandes SQL que SELECT ?
Pour exécuter d'autres commandes SQL supportées par Hsqldb, il faut utiliser un autre outil SQL, accessible dans le menu principal de Base en sélectionnant Outils > SQL ....
Il est alors possible de saisir d'autres commandes SQL.
Je n'ai pas testé cet outil de manière poussée mais vous pouvez créer une table par ce biais. Saisissez l'instruction suivante :
CREATE TABLE CLIENTS (ID_CLIENT INTEGER IDENTITY, NOM VARCHAR(50), DATE_CREA DATE) |
et cliquez sur Exécuter. Un message vous confirme que l'instruction a bien été exécutée. Mais si vous affichez les tables, la table CLIENTS n'apparaît pas . Il faut ensuite, toujours avec les tables affichées, sélectionner le menu Afficher > Actualiser les tables pour que la table ainsi créée apparaisse.
Pour utiliser des caractères en minuscules ou spéciaux, il faut encadrer les chaînes littérales de guillemets doubles :
CREATE TABLE "Clients" ("id_client" INTEGER IDENTITY, "Nom" VARCHAR(50), "Date_créa" DATE)
La commande INSERT semble aussi fonctionner. Il faut donc tester avant d'utiliser cet outil.
7 Quelles sont les fonctions et procédures intégrées supportées ?
Là encore, c'est la documentation Hsqldb qui peut vous renseigner. Voir le chapitre «Built-in Functions and Stored Procedures».
Pour les fonctions d'agrégation statistique, sont supportées :
8 Les fonctions intégrées retournent des valeurs NULL
Si vous n'attribuez pas d'alias à une fonction :
SELECT SUM("QTE_PROD") FROM "LIGNE_COMMANDE" WHERE "REF_PROD" = 1
le résultat apparaît vide. Par contre :
fonctionne bien. Il faut donc systématiquement attribuer un alias aux fonctions et procédures.
9 Les regroupements renvoient des messages d'erreur
La requête :
SELECT "REF_COM", SUM("QTE_PROD"*"PX_UNITAIRE") AS "Total commande" FROM "LIGNE COMMANDE", "PRODUITS" WHERE "REF PROD" = "ID PRODUIT" GROUP BY
"REF_COM"
fonctionne correctement. Mais si on rajoute un champ dans la requête :
SELECT "REF_COM", "REF_PROD", SUM("QTE_PROD"*"PX_UNITAIRE") AS "Total commande" FROM "LIGNE_COMMANDE", "PRODUITS" WHERE "REF_PROD" = "ID_PRODUIT" GROUP BY "REF_COM"
on a droit à un beau message d'erreur évoquant les fonctions d'agrégation.
« La présence de la clause GROUP BY est nécessaire dès que la clause de sélection, ou le filtre WHERE, ou encore les jointures comportent simultanément des calculs d'agrégation et la présence de colonnes de table hors de calculs d'agrégation.
De plus, toutes les colonnes représentées hors des calculs d'agrégation doivent figurer dans la clause GROUP BY » (SQLpro dans)
Il faut donc saisir les requêtes ainsi :
SELECT "REF_COM", "REF_PROD", SUM("QTE_PROD"*"PX_UNITAIRE") AS "Total commande" FROM "LIGNE_COMMANDE", "PRODUITS" WHERE "REF_PROD" = "ID_PRODUIT" GROUP BY "REF_COM", "REF_PROD"