DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / Editeurs / Editeur de requêtes / SQL
  • Présentation
  • SELECT
  • SELECT
  • Cas particulier : SELECT multifichiers
  • Cas particuliers : SELECT sans FROM ou SELECT utilisant une table virtuelle
  • Exécuter une procédure stockée
  • INSERT
  • INSERT
  • INSERT avec sélection
  • UPDATE
  • DELETE
  • CREATE TABLE
  • Types disponibles
  • CREATE TABLE AS
  • DROP TABLE
  • ALTER TABLE
  • CREATE INDEX
  • DROP INDEX
  • GRANT
  • REVOKE
  • CREATE VIEW
  • DROP VIEW
  • CREATE MATERIALIZED VIEW
  • DROP MATERIALIZED VIEW
  • REFRESH MATERIALIZED VIEW
  • OPTIMIZE TABLE
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
Les principales instructions SQL autorisées dans les requêtes SQL gérées par WINDEV et WEBDEV sont les suivantes :
Pour plus de détails sur les instructions SQL, consultez une documentation spécifique au langage SQL.
Pour connaître toutes les commandes SQL (fonctions, clauses, opérateurs, ...) utilisables dans une requête SQL gérée par HFSQL, consultez Commandes utilisables dans une requête SQL gérée par HFSQL.
Remarques :
  • Ces instructions sont utilisables :
    • dans le code SQL des requêtes créées sous l'éditeur de requêtes. Ces requêtes sont ensuite exécutées grâce à la fonction HExécuteRequête.
    • dans le code SQL des requêtes exécutées avec la fonction du WLangage HExécuteRequêteSQL.
  • Le caractère " peut être utilisé comme délimiteur d'identifiant dans les requêtes SQL comme prévu par la norme SQL92.
Le logiciel Etats et Requêtes ne permet pas de créer des requêtes en code SQL utilisant les ordres INSERT, UPDATE ou DELETE.
SELECT

SELECT

L'instruction SELECT permet de rechercher des enregistrements dans un ou plusieurs fichiers.
Format d'utilisation :
SELECT [ALL/DISTINCT] NomDesRubriques AS NomDesRubriquesUtilisé
FROM NomDesFichiers AS NomDesFichiersUtilisé
[WHERE JointuresFichiers [AND] ConditionsSélection]
[GROUP BY NomDesRubriques [HAVING Condition]]
[ORDER BY NomDesRubriques]
Exemple : Le code SQL suivant permet de visualiser la somme totale des commandes par client habitant en Côte d'Or. Le résultat sera regroupé par nom du client, par code postal et par ville. Seuls les clients ayant un cumul des commandes supérieur à 3000 Euros seront conservés. Le résultat sera trié par ordre croissant selon le cumul des commandes :
SELECT CLIENT.NomClient AS NomClient,
CLIENT.CodePostal AS CodePostal,
CLIENT.Ville AS Ville,
SUM(COMMANDE.TotalTTC) AS TotalTTC
FROM CLIENT AS CLI, COMMANDE AS COM
WHERE CLI.NumClient = COM.NumClient
AND CodePostal LIKE '21%'
GROUP BY NomClient, CodePostal, Ville
HAVING TotalTTC > 3000
ORDER BY TotalTTC ASC
Remarques :
  • Le mot-clé DISTINCT permet de supprimer les enregistrements dupliqués (doublons) du résultat de la requête.
  • Pour plus de détails sur les conditions de sélection, consultez Conditions de sélection dans une requête SQL.
  • Une requête de sélection peut être réalisée avec l'éditeur de requêtes. Pour plus de détails, consultez Création d'une requête de sélection.
  • Dans la syntaxe de l'instruction SELECT, le paramètre NomDesRubriques peut contenir une ou plusieurs conditions de sélection. Par exemple :
    SELECT NomClient, Age>18 AS Majeur FROM Client
  • L'instruction SELECT peut être utilisée comme une expression scalaire, c'est-à-dire qu'il est possible d'utiliser l'instruction SELECT à la place d'une valeur ou d'une colonne dans des instructions comme INSERT, UPDATE, SELECT, etc.
    Par exemple :
    INSERT INTO TABLE (nom, valeur) VALUES ( 'Rome a Rick',
    (SELECT MAX(nombre) FROM table2) )

    UPDATE client SET cattc = (SELECT SUM(facture.total_ttc)
    FROM facture WHERE facture.reference=client.reference)

    SELECT NomDesRubriques AS NomDesRubriquesUtilisé,
    (SELECT COUNT(*) FROM Table2 WHERE Rub=NomDesRubriquesUtilisé)
    FROM Table1
Remarque : La requête SELECT utilisée comme expression scalaire doit renvoyer un résultat sur une seule colonne et une seule ligne.

Cas particulier : SELECT multifichiers

L'instruction SELECT permet également de sélectionner dans une requête multifichier toutes les colonnes d'un fichier de données grâce à la syntaxe suivante :
SELECT Ligne_Commande.*,Commande.NumCommande, ...
FROM Commande, Ligne_Commande
Cette syntaxe est particulièrement intéressante dans le cadre de jointures et évite la saisie fastidieuse de chaque nom de rubrique.

Cas particuliers : SELECT sans FROM ou SELECT utilisant une table virtuelle

L'instruction SELECT permet également d'exécuter des requêtes ne portant pas sur des tables :
  • soit en utilisant la syntaxe sans clause "FROM".
    Exemple :
    SELECT TO_CHAR(12,'RN')
  • soit en utilisant la table virtuelle DUAL. Cette table virtuelle contient une seule rubrique (nommée "dummy") et un seul enregistrement.
    Exemple :
    SELECT CURRENT_DATE FROM DUAL

Exécuter une procédure stockée

L'instruction SELECT permet également d'exécuter directement des procédures stockées.
La syntaxe pour exécuter la procédure stockée est la suivante :
SELECT NomDeLaProcédureStockée(ParamètreNumérique,'ParamètreChaîne',....) [FROM DUAL]
Remarques :
  • La procédure stockée doit être une fonction stockée : elle doit toujours renvoyer une valeur. Dans le cas contraire, une erreur d'exécution sera générée.
  • Si le nom de la procédure stockée est identique à celui d'une fonction ou procédure du projet, il est nécessaire de préfixer son nom par le nom de la collection de procédures stockées.
  • Le résultat d'une procédure stockée peut également être un des paramètres d'une requête de type SELECT.
INSERT

INSERT

L'instruction INSERT permet d'ajouter  :
  • un enregistrement dans un fichier de données.
  • plusieurs enregistrements dans un fichier de données.
Son format d'utilisation est :
INSERT INTO NomDuFichier (NomDesRubriques)
VALUES (ValeurRubriques ajout 1), (ValeurRubriques ajout 2), ... , (ValeurRubriques ajout N)
RETURNING ValeurRetour
Nouveauté 2024
La clause RETURNING permet de renvoyer en retour d'exécution un résultat pour chacun des enregistrements traités par la requête.
Exemples : Les codes SQL suivants permettent d'insérer :
  • un nouveau client dans le fichier CLIENT (l'ensemble des informations du client est fourni).
    INSERT INTO CLIENT
    VALUES (77, 'Martin', 'Julie', '1 rue Giono',...
    '69000', 'Lyon')
  • un nouveau client dans le fichier CLIENT : seuls le numéro, le nom et le prénom du client sont fournis :
    INSERT INTO CLIENT (NumClient, NomClient, PrénomClient)
    VALUES (77, 'Martin', 'Julie')
  • 3 produits dans un fichier PRODUIT :
    INSERT INTO PRODUIT
    VALUES ('Ref01', 'Eau minérale'), ('Ref02', 'Beurre'), ('Ref03', 'Eponge')
  • Nouveauté 2024
    un nouveau client dans le fichier CLIENT : l'identifiant du client créé est renvoyé.
    INSERT INTO CLIENTS (Nom, Prenom) VALUES ('Dupont', 'Paul') RETURNING idClients
Remarques :
  • Une requête d'insertion peut être créée sous l'éditeur de requêtes. Pour plus de détails, consultez Création d'une requête d'insertion.
  • Pour connaître la valeur de l'identifiant automatique lors d'une requête de type INSERT sur des fichiers HFSQL (requête exécutée par la fonction HExécuteRequêteSQL, HExécuteRequête ou SQLExec), utilisez la variable SQL.IDAuto.
  • Il n'est pas possible d'utiliser l'instruction INSERT pour copier les données d'un fichier HFSQL dans un autre fichier HFSQL.
  • La variable H.NbEnregRequêteModification permet de connaître le nombre d'enregistrements insérés.

INSERT avec sélection

L'instruction INSERT peut également être utilisée pour insérer une sélection d'enregistrements réalisée par une requête SELECT. Son format d'utilisation devient :
INSERT INTO NomDuFichier [(NomDesRubriques)] SELECT ...
Remarques :
  • Le nombre de rubriques à insérer doit être identique au nombre de valeurs renvoyées par la requête SELECT.
  • Si aucune rubrique n'est précisée dans l'instruction INSERT, toutes les rubriques du fichier sont prises en compte.
  • Ce type de requête ne peut pas être créé directement dans l'éditeur de requêtes.
UPDATE
L'instruction UPDATE permet de mettre à jour des enregistrements dans un fichier. Son format d'utilisation est le suivant :
UPDATE NomDuFichier
SET NomDeLaRubrique = Expression
[WHERE Conditions]
RETURNING ValeurRetour
Nouveauté 2024
La clause RETURNING permet de renvoyer en retour d'exécution un résultat pour chacun des enregistrements traités par la requête.

Exemples :
  • Le code SQL suivant permet de modifier la civilité et le nom du client Montgomery :
    UPDATE CLIENT
    SET Civilité = 'Mme',
    NomClient = 'Darwin'
    WHERE NomClient = 'Montgomery'
  • Le code SQL suivant permet de modifier le nom du client dans le fichier Client. Pour les enregistrements ayant le même identifiant, le nom du client dans le fichier Client est remplacé par le nom du client dans le fichier Client_Svg :
    UPDATE CLIENT, CLIENT_SVG
    SET CLIENT.Nom = CLIENT_SVG.Nom
    WHERE CLIENT.ID = CLIENT_SVG.ID
  • Nouveauté 2024
    Le code SQL suivant permet de modifier les produits et renvoie la liste des enregistrements correspondant aux produits modifiés.
    UPDATE PRODUIT SET FlagActif = 0 WHERE idFour = 10 RETURNING *
Remarques sur l'utilisation de l'instruction UPDATE dans WINDEV :
  • La clause WHERE accepte des sous-sélections (par SELECT), à condition que la sous-sélection soit relative à un autre fichier.
  • L'expression SET n'accepte pas de sous-sélection (pas de commande SELECT directement après SET). De la même façon il n'est pas possible de faire une jointure au niveau de la partie UPDATE de la requête.
    La requête suivante est acceptée :
    UPDATE ARTICLE SET PrixVente = 1000
    WHERE RefArticle IN (SELECT COMMANDE.RefArticle FROM COMMANDE)
    -- Sous-requête dans le WHERE: OK

    La requête suivante n'est pas acceptée :
    UPDATE Article
    SET PrixVente = (SELECT AVG(COMMANDE.PrixUnit) FROM COMMANDE
    -- Sous-requête dans le SET: NON VALIDE
    WHERE COMMANDE.RefArticle = ARTICLE.RefArticle
    GROUP BY COMMANDE.RefArticle)
    WHERE RefArticle IN (SELECT COMMANDE.RefArticle FROM COMMANDE)

    Et de la même façon la requête suivante n'est pas acceptée :
    UPDATE Article INNER JOIN PRODUIT ON (Article.IdArticle = Produit.IdProduit)
    -- Jointure dans le UPDATE : NON VALIDE
    SET Article.PrixVente = Produit.PrixVente
    WHERE RefArticle IN (SELECT COMMANDE.RefArticle FROM COMMANDE)
  • Une requête de mise à jour peut être créée directement sous l'éditeur de requêtes. Pour plus de détails, consultez Création d'une requête de modification.
  • L'apostrophe sert de délimiteur pour les chaînes dans les requêtes SQL. Si la valeur à écrire doit contenir une apostrophe, cette valeur doit être précédée du caractère antislash ('\'). Par exemple :
    UPDATE CLIENT
    SET Adresse = 'Rue de l\'écluse'
    WHERE NomClient = 'Montgomery'
  • La variable H.NbEnregRequêteModification permet de connaître le nombre d'enregistrements mis à jour.
DELETE
L'instruction DELETE permet de supprimer des enregistrements dans un fichier. Son format d'utilisation est le suivant :
DELETE FROM NomDuFichier
WHERE Conditions
RETURNING ValeurRetour
Nouveauté 2024
La clause RETURNING permet de renvoyer en retour d'exécution un résultat pour chacun des enregistrements traités par la requête.
Exemples :
  • Le code SQL suivant permet de supprimer les clients nés entre le 01/01/1971 et le 01/01/1975 :
    DELETE FROM CLIENT
    WHERE CLIENT.DateNaissance BETWEEN '19710101' AND '19750101'
  • Nouveauté 2024
    Le code SQL suivant permet de renvoyer l'identifiant des clients supprimés :
    DELETE FROM CLIENT
    WHERE CODEPOSTAL = '75000'
    RETURNING CLIENT.IDCLIENT AS ID
Remarque : Une requête de suppression peut être créée directement avec l'éditeur de requêtes. Pour plus de détails, consultez Création d'une requête de suppression.
CREATE TABLE
L'instruction CREATE TABLE permet de décrire une table et de la créer. Son format d'utilisation est le suivant :
CREATE TABLE NomTable
(
Description de la rubrique1,
Description de la rubrique2,
...
Description Index1,
Description Index2,
...
)
Dans cette syntaxe :
  • les paramètres "Description de rubrique" correspondent à :
    NomRubrique type  [DEFAULT 'valeur' | DEFAULT NULL] [NOT NULL]
      [UNIQUE] [PRIMARY KEY]  [AUTO_INCREMENT] [COMMENT 'libellé'] [COLLATE 'langue']
    où :
    • NomRubrique : nom à donner à la rubrique.
    • Type : Type de la rubrique (choisi parmi les types disponibles présentés ci-dessous).
    • DEFAULT : permet de fixer la valeur par défaut de la rubrique.
    • NOT NULL : permet d'interdire d'affecter la valeur NULL à la rubrique.
    • UNIQUE : permet de définir une rubrique avec ou sans doublons.
    • PRIMARY KEY : permet de définir une clé primaire.
    • AUTO_INCREMENT : permet de définir un identifiant automatique pour les rubriques de type entier.
    • COMMENT : permet de définir le libellé de la rubrique.
    • COLLATE : permet de définir la langue de tri de la rubrique (par exemple : 'FR_BE').
  • les paramètres "Description d'index" correspondent à :
    INDEX  NomIndex ( rub1 [ASC | DESC] [CI] [AI] [PI], rub2 ... ) [UNIQUE]
    où :
    • ASC et DESC : permet de définir le sens du tri.
    • CI : permet d'indiquer que la case est ignorée.
    • AI : permet d'indiquer que les accents sont ignorés.
    • PI : permet d'indiquer que la ponctuation est ignorée.
Remarque : Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.

Types disponibles

Les types disponibles sont :
CHARACTERChaîne de caractères
CHARACTER(Taille)Chaîne sur taille
VARCHAR(Taille)Chaîne sur taille
CHARACTER VARYING(Taille)Chaîne sur taille
CHAR VARYING(Taille)Chaîne sur taille
NVARCHAR(Taille)Chaîne Unicode sur taille
VARCHAR(Taille) BINARYChaîne binaire sur taille
BINARY(Taille)Chaîne binaire sur taille
VARBINARY(Taille)Chaîne binaire sur taille
BLOBMémo binaire
CLOBMémo texte
TEXTMémo texte
NCLOBMémo Unicode
NTEXTMémo Unicode
NUMBER(Précision)Entier
NUMBER(Précision, échelle)Entier
DECIMAL(Précision)Réel
DECIMAL(Précision, échelle)Réel
TINYINT UNSIGNEDEntier non signé sur 1 octet
SMALLINT UNSIGNEDEntier non signé sur 2 octets
INTEGER UNSIGNEDEntier non signé sur 4 octets
BIGINT UNSIGNEDEntier non signé sur 8 octets
TINYINTEntier signé sur 1 octet
SMALLINTEntier signé sur 2 octets
INTEGEREntier signé sur 4 octets
BIGINTEntier signé sur 8 octets
FLOATRéel sur 4 octets
REALRéel sur 8 octets
DOUBLE PRECISIONRéel sur 8 octets
MONEYMonétaire
DATEDATE
DATETIMEDate heure
TIMEHeure
BOOLEANBooléen
SECUREPASSWORDMot de passe sécurisé
CREATE TABLE AS
L'instruction CREATE TABLE AS permet de décrire une table et de la créer à partir du résultat d'une requête de sélection. Les colonnes de la table ont les noms et les types de données associés aux colonnes en sortie de la requête de type SELECT.
Son format d'utilisation est le suivant :
CREATE TABLE NomTable AS RequêteSélection [WITH NO DATA]
Dans cette syntaxe :
  • RequêteSélection est une requête de sélection (SELECT). La requête est exécutée et la table est créée à partir du résultat de cette requête de sélection.
  • L'option "WITH NO DATA" permet de créer uniquement la structure de la table (sans les données contenues dans le résultat de la requête de sélection).
Attention : La table créée peut avoir un index différent de la table d'origine.
Remarque : Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
DROP TABLE
L'instruction DROP TABLE permet de supprimer physiquement une table. Son format d'utilisation est le suivant :
DROP TABLE [ IF EXISTS ] name [, ...]
Remarques :
  • IF EXISTS permet de ne pas renvoyer d'erreur si la table n'existe pas.
  • Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
ALTER TABLE
L'instruction ALTER TABLE permet de changer la structure d'une table existante. Par exemple, vous pouvez ajouter ou supprimer des colonnes, des index, changer le type des colonnes existantes, renommer ces colonnes, ou la table elle-même. Son format d'utilisation est le suivant :
ALTER TABLE NomTable Action [, Action] ....
Dans cette syntaxe :
  • les paramètres "Action" correspondent à une des actions suivantes :
    ADD [COLUMN] Description de rubrique
    ADD [COLUMN] (Description de rubrique1 [,Description de rubrique2]....)
    DROP [COLUMN] [IF EXISTS] NomRubrique
    DROP [COLUMN] [IF EXISTS] (NomRubrique1 [, NomRubrique2]...)
    ALTER [COLUMN] NomRubrique [SET DATA] TYPE alter_type_desc
    ALTER [COLUMN] NomRubrique SET DEFAULT <valeur>
    ALTER [COLUMN] NomRubrique DROP DEFAULT
    ALTER [COLUMN] NomRubrique ADD MASKED (FUNCTION = xxxx)
    ALTER [COLUMN] NomRubrique DROP MASKED
    ADD [UNIQUE / PRIMARY KEY] INDEX [<NomIndex>] (Description d'index
    [, Description d'index2], ...)
    DROP INDEX [IF EXISTS] NomIndex
    DROP INDEX [IF EXISTS] (NomIndex1 [, NomIndex2]...)
    RENAME COLUMN NomRubrique TO Nouveau_NomRubrique
  • Les paramètres "Description de rubrique" correspondent à :
    NomRubrique type  [DEFAULT 'valeur' | DEFAULT NULL] [NOT NULL] [UNIQUE] [PRIMARY KEY]
     [AUTO_INCREMENT] [COMMENT 'libellé'] [COLLATE 'langue']
    où :
    • NomRubrique : nom à donner à la rubrique.
    • Type : Type de la rubrique (choisi parmi les types disponibles présentés ci-dessus).
    • DEFAULT : permet de fixer la valeur par défaut de la rubrique.
    • NOT NULL : permet d'interdire d'affecter la valeur NULL à la rubrique.
    • UNIQUE : permet de définir une rubrique avec ou sans doublons.
    • PRIMARY KEY : permet de définir une clé primaire.
    • AUTO_INCREMENT : permet de définir un identifiant automatique pour les rubriques de type entier.
    • COMMENT : permet de définir le libellé de la rubrique.
    • COLLATE : permet de définir la langue de tri de la rubrique (par exemple : 'FR_BE').
    • SECUREPASSWORD : permet de définir que la rubrique est du type "Mot de passe".
  • les paramètres "Description d'index" correspondent à :
    NomRubrique [ASC | DESC] [CI] [AI] [PI]
    où :
    • ASC et DESC : permet de définir le sens du tri.
    • CI : permet d'indiquer que la case est ignorée.
    • AI : permet d'indiquer que les accents sont ignorés.
    • PI : permet d'indiquer que la ponctuation est ignorée.
  • Nouveauté 2024
    Gestion de l'anonymisation : ADD MASKED / DROP MASKED :
    • La commande ADD MASKED permet de créer un masque d'anonymisation sur une rubrique de fichier. La syntaxe est la suivante :
      ALTER TABLE <Nom table> ALTER COLUMN <Nom rubrique> ADD MASKED (FUNCTION = '<code fonction>')
      où <code fonction> représente le code du masque d'anonymisation qui va être créé.
      Les cas possibles sont les suivants :
      • Ecart aléatoire : noise
        La commande SQL noise modifie la valeur d'origine en lui appliquant un ratio (coefficient entre 0 et 1). La valeur calculée sera ainsi renvoyée à la place de la valeur d'origine.
        Syntaxe :
        noise(<ratio>)
        avec <ratio> représente un nombre entre 0 et 1 (non compris). Il s'agit d'un pourcentage qui sera appliqué en plus ou en moins.
        Exemple :
        • Applique un ratio de + ou - 20% à la valeur d'origine : noise(0.2)
        • Dans une requête SQL : Ajoute + ou - 20% à la valeur d'origine stockée dans la rubrique prix du fichier de données Produit
          ALTER TABLE Produit ALTER COLUMN PrixHT ADD MASKED (FUNCTION = 'noise(0.2)')
      • Remplacement de valeur (ou destruction)
        La commande SQL value modifie la valeur d'origine en la remplaçant par une valeur fixe de type chaîne. Cette valeur fixe sera ainsi renvoyée à la place de la valeur d'origine.
        Syntaxe :
        value(<valeur chaine>)
        avec <valeur chaîne> représente une chaîne de caractères avec des guillemets.
        Exemples :
        • Remplace la valeur d'origine par le texte "DEMO" : value("DEMO")
        • Dans une requête SQL : Remplace la valeur d'origine stockée dans la rubrique Statut du fichier de données Commande par la valeur fixe "SOLDEE".
          ALTER TABLE Commande ALTER COLUMN Statut ADD MASKED (FUNCTION = 'value("SOLDEE")')
      • Génération de valeur aléatoire (randomisation)
        Pour générer une valeur aléatoire, plusieurs fonctions sont disponibles, ces fonctions dépendent du type de la valeur aléatoire à générer. Chaque fonction va générer une valeur aléatoire en fonction du type et des paramètres passés à la fonction. Cette valeur aléatoire sera ainsi renvoyée à la place de la valeur d'origine.
        • Fonction random_int_between : La fonction random_int_between génère une valeur entière aléatoire dans la fourchette de valeurs demandée.
          Syntaxe :
          random_int_between (<valeur entière mini>, <valeur entière maxi>)
          avec :
          - <valeur entière mini> : Valeur minimale possible pour l'entier généré.
          - <valeur entière maxi> : Valeur maximale possible pour l'entier généré.
          Exemples :
          • Génère une valeur entière entre 5 et 90 : random_int_between(5, 90)
          • Dans une requête SQL : Remplace la valeur d'origine stockée dans la rubrique Quantite du fichier de données LigneCommande par une valeur aléatoire comprise entre 1 et 50.
            ALTER TABLE LigneCommande ALTER COLUMN Quantite ADD MASKED (FUNCTION = 'random_int_between(1, 50)')
        • Fonction random_date_between : La fonction random_date_between génère une date aléatoire dans la fourchette de dates demandée.
          Syntaxe :
          random_date_between (<valeur date mini>, <valeur date maxi>)
          avec :
          - <valeur date mini> représente la valeur minimale possible pour la date générée.
          - <valeur date maxi> représente la valeur maximale possible pour la date générée.
          Les valeurs <date mini> et <date maxi> doivent être écrites entre guillemets et au format AAAAMMJJ.
          Exemples :
          • Génère une date entre le 01 Janvier 2022 et le 31 Décembre 2022 : random_date_between ("20220101", "20221231")
          • Dans une requête SQL : Remplace la valeur d'origine stockée dans la rubrique DateCde du fichier de données Commande par une date aléatoire comprise entre le 1er Janvier 2023 et le 31 Juillet 2023.
            ALTER TABLE Commande ALTER COLUMN DateCde ADD MASKED (FUNCTION = 'random_date_between("20230101", "20230731")')
        • Fonction lorem_ipsum
          La fonction lorem_ipsum génère une chaîne de caractères dont le contenu est composé d'une suite de lettres aléatoires, selon la longueur demandée.
          Syntaxe :
          lorem_ipsum (<longueur de la chaîne générée>)
          avec <longueur de la chaîne générée> est un entier qui représente le nombre de caractères à générer pour remplir la chaîne de caractères à retourner.
          Exemples :
          • Génère une chaîne de caractères d'une longueur de 80 : lorem_ipsum (80)
          • Dans une requête SQL : Remplace la valeur d'origine stockée dans la rubrique Commentaires du fichier de données Commande par une chaîne au contenu aléatoire sur une longueur de 200 caractères.
            ALTER TABLE Commande ALTER COLUMN Commentaires ADD MASKED (FUNCTION = 'lorem_ipsum(200)')
      • Remplacement partiel du contenu d'une chaîne (partial scrumbling)
        La fonction partial remplace une partie de la chaîne de caractères d'une rubrique par une série de caractères fixe. Seule la portion de caractères 'visée' sera remplacée. Il est possible de laisser tel quels une partie du début de la chaîne (préfixe) et/ou une partie de la fin de la chaîne (suffixe). La taille de la chaîne d'origine n'est pas changée. Si la valeur d'origine est trop courte par rapport aux paramètres définis de la fonction partial, la partie du préfixe ou du suffixe ne sera pas exposée.
        Syntaxe :
        partial(<longueur du préfixe>, <Chaîne de remplacement>, <longueur du suffixe>)
        avec
        - <Chaîne de remplacement> représente la chaîne entre guillemets qui remplacera la partie équivalente dans la chaîne d'origine. Cette valeur sera répétée tant que la taille maximum de la chaîne d'origine n'est pas atteinte (en comptant bien entendu les longueurs des préfixe et suffixe).
        - <longueur du suffixe> est un entier qui représente la taille de la partie de la fin de la chaîne à ne pas exposer.
        Exemples :
        • Génère une chaîne de caractères d'une longueur de 80 : lorem_ipsum (80)
        • Dans une requête SQL : Remplace une partie de la valeur d'origine stockée dans la rubrique Nom du fichier de données Client par une chaîne fixe "DEMO". Les 3 premiers caractères de la chaîne et les 2 derniers caractères ne sont pas remplacés.
          ALTER TABLE Client ALTER COLUMN Nom ADD MASKED (FUNCTION = 'partial(3, "DEMO", 2)')
          Exemple de contenu généré : Chaîne originale: JEAN VALJEAN devient JEADEMODEMAN
        • Dans une requête SQL : Remplace une partie de la valeur d'origine stockée dans la rubrique Nom du fichier de données Client par une répétition de la chaîne fixe "*". Les 1 premier caractère de la chaîne et le dernier caractère ne sont pas remplacés.
          ALTER TABLE Client ALTER COLUMN Nom ADD MASKED (FUNCTION = 'partial(1, "*", 1)')
          Exemple de contenu généré : P*******E
      • Procédure stockée
        Il est possible de personnaliser la règle de transformation des données. Pour cela, il est possible de définir une procédure stockée. Cette procédure sera associée à la rubrique du fichier à transformer.
        Syntaxe :
        procedure("<nom procédure stockée")
        avec <nom procédure stockée> qui représente le nom de la procédure stockée à appeler. La procédure stockée ne peut pas recevoir de valeur en paramètres. Elle retourne obligatoirement la valeur qui sera affectée à la rubrique masquée.
        Attention à renvoyer une valeur dont le type correspond au type de la rubrique masquée.
        Exemple dans une requête SQL : Remplace la valeur d'origine stockée dans la rubrique StockAlerte du fichier de données Produit par une valeur calculée aléatoire à l'aide de la procédure stockée RandomStock.
        ALTER TABLE Produit ALTER COLUMN StockAlerte ADD MASKED (FUNCTION = 'procedure("RandomStock")')
    • La commande DROP MASKED permet de supprimer un masque d'anonymisation sur une rubrique de fichier. La syntaxe est la suivante :
      ALTER TABLE <Nom table> ALTER COLUMN <Nom rubrique> DROP MASKED
Remarques :
  • Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
  • Pour utiliser la table modifiée lors du ALTER (sans analyse liée au projet), il faut utiliser la fonction HDéclareExterne après l'exécution de la requête de type ALTER TABLE.
CREATE INDEX
L'instruction CREATE INDEX est équivalente à l'instruction ALTER TABLE pour créer des index. Cette instruction permet d'ajouter des index à une table existante. Son format d'utilisation est le suivant :
CREATE [UNIQUE] INDEX [NomIndex] ON NomTable (Description d'index [, Description d'index]... )
Dans ce code, les paramètres "Description d'index" correspondent à :
NomRubrique [ASC | DESC] [CI] [AI] [PI]
où :
  • ASC et DESC : permet de définir le sens du tri.
  • CI : permet d'indiquer que la case est ignorée.
  • AI : permet d'indiquer que les accents sont ignorés.
  • PI : permet d'indiquer que la ponctuation est ignorée.
Remarque : Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
Il est possible d'utiliser l'instruction CREATE INDEX sur une vue matérialisée. Dans ce cas, le paramètre NomTable correspond au nom d'une vue matérialisée. Si la vue est rafraîchie, les index sont mis à jour automatiquement : il n'est pas nécessaire de recréer les index.
Exemple : Création d'une vue matérialisée et en même temps d'une clé composée sur cette vue.
-- Création d'une vue matérialisée
CREATE MATERIALIZED VIEW MaVueMaterialisee AS
SELECT
Client.Departement, Client.Aff, Client.TypeAdherent, COUNT(*) AS Qte
FROM Client
WHERE Client.Solde>0 AND Client.Type=2
AND Client.Famille IN ('A', 'D', 'O')
GROUP BY Client.Departement, Client.Aff, Client.TypeAdherent;
--';' pour pouvoir mettre une autre instruction SQL après
--Avec une clé composée
CREATE INDEX clecomp ON MaVueMaterialisee (Departement ASC CI AI PI,
Aff ASC CI AI PI,TypeAdherent ASC)
DROP INDEX
L'instruction DROP INDEX permet de supprimer physiquement un index d'une table. Son format d'utilisation est le suivant :
DROP INDEX  [ IF EXISTS ] NomIndex ON NomTable
IF EXISTS : permet de ne pas renvoyer d'erreur si l'index n'existe pas.
Remarque : Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
GRANT
Les requêtes de type GRANT permettent de donner des droits sur un serveur HFSQL. Cette instruction est équivalente à donner le droit hAutorisé à l'élément. Son format d'utilisation est le suivant :
  • Donner les droits demandés sur les tables spécifiées aux utilisateurs spécifiés :
    GRANT droit[, droit [, ... ]] ON [TABLE] table [, table [, ...]]  
    TO utilisateur [, utilisateur [, ...]]
  • Donner les droits demandés sur les bases spécifiées aux utilisateurs spécifiés.
    GRANT droit[, droit [, ... ]] ON DATABASE database [, database [, ...]]
    TO utilisateur [, utilisateur [, ...]]
  • Donner les droits demandés sur le serveur.
    GRANT droit[, droit [, ... ]]
    TO utilisateur [, utilisateur [, ...]]
  • Nouveauté 2024
    Donner les droits demander sur une rubrique aux utilisateurs spécifiés :
    GRANT droit[, droit [, ... ]] ON COLUMN rubrique [, rubrique[, ...]]
    FROM TABLE table TO utilisateur [, utilisateur [, ...]]
Remarque :
  • Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
  • Ces requêtes ne peuvent pas êtres utilisées sur une base de données HFSQL Classic ni sur une base de données accédée par les Connecteurs natifs.
Droits disponibles
Les droits disponibles sont :
Droit SQLDroit HFSQL
INSERThDroitAjout
LOCKhDroitBlocage
MANAGE RIGHTShDroitChangeDroit
OWNERhDroitChangePropriétaire
MANAGE DUPLICATEhDroitGèreDoublon
SELECThDroitLecture
MAINTENANCEhDroitMaintenance
ALTERhDroitModifAuto
UPDATEhDroitModification
DELETEhDroitSuppression
DELETE FILEhDroitSuppressionFichier
REFERENCEShDroitChangeLiaison
CONNECThDroitConnexion
ENCRYPTED CONNECThDroitConnexionCryptée
CREATEhDroitCréationFichier
DEBUGhDroitDéboguer
RUN PROCEDUREhDroitExécutionProcédure
MANAGE REFERENCEShDroitGèreIntégrité
MANAGE PROCEDUREhDroitGestionProcédure
MANAGE TRIGGERhDroitGestionTrigger
FORBID ACCESShDroitInterditAccèsBaseDeDonnées
BACKUPhDroitSauvegarde
DELETE DATABASEhDroitSuppressionBDD
STOPhDroitArrêtServeur
CHANGE PASSWORDhDroitChangeMotDePasse
CREATE DATABASEhDroitCréationBDD
DISCONNECThDroitDéconnecteClient
SEND MESSAGEhDroitEnvoieMessageVersClient
MANAGE TASKhDroitGèreTâche
MANAGE SERVERhDroitGestionServeur
MANAGE USERhDroitGestionUtilisateur
READ LOGhDroitLectureLogStat
PRIORITYhDroitPriorité
REPLICATEhDroitRéplicationServeur
SEE USERhDroitVisualisationUtilisateur
Nouveauté 2024
MASK/UNMASK
hDroitAnonymisation
REVOKE
Les requêtes de type REVOKE permettent de retirer des droits (passent les droits en hHérité) sur un serveur HFSQL). Son format d'utilisation est le suivant :
  • Mettre les droits demandés en hérité sur les tables spécifiées aux utilisateurs spécifiés.
    REVOKE droit[, droit [, ... ]] ON [TABLE] table [, table [, ...]]  
    FROM utilisateur [, utilisateur [, ...]]
  • Mettre les droits demandés en hérité sur les bases spécifiées aux utilisateurs spécifiés.
    REVOKE droit[, droit [, ... ]] ON DATABASE database [, database [, ...]]
    FROM utilisateur [, utilisateur [, ...]]
  • Mettre les droits demandés en hérité sur le serveur.
    REVOKE droit[, droit [, ... ]] FROM utilisateur [, utilisateur [, ...]]
  • Nouveauté 2024
    Mettre les droits demandés en hérité sur les rubriques spécifiées aux utilisateurs spécifiés :
    UNVOKE droit[, droit [, ... ]] ON COLUMN rubrique [, rubrique[, ...]]
    FROM TABLE table TO utilisateur [, utilisateur [, ...]]
Remarque
  • Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
  • Ces requêtes ne fonctionnent pas en HFSQL Classic ni via les Connecteurs Natifs.
Droits disponibles : Les droits disponibles sont identiques à la commande SQL GRANT. Vous trouverez le tableau des droits au niveau de la commande GRANT.
CREATE VIEW
L'instruction CREATE VIEW permet de créer une vue SQL. Les vues SQL sont assimilées à des fichiers temporaires en mémoire. Une vue SQL est généralement un extrait d'un fichier ou de plusieurs fichiers. Une vue peut à son tour être manipulée par une commande SELECT.
Pour plus de détails sur les vues SQL, consultez Vue SQL.
Son format d'utilisation est le suivant :
CREATE VIEW Vue [ ( Alias 1, Alias 2, ..., Alias N) ] AS RequêteSELECT
Dans cette syntaxe :
  • Vue est le nom de la vue.
  • Alias 1, Alias 2, Alias N représentent les noms d'alias donnés aux rubriques issues de la requête SELECT.
  • RequêteSELECT est la requête de type SELECT permettant de sélectionner les enregistrements présents dans la vue.
Exemple SQL : Création d'une vue SQL contenant uniquement la société, le nom et le téléphone des clients :
CREATE VIEW V_Clients
AS SELECT Société, Nom, Téléphone FROM Clients
DROP VIEW
La fonction DROP VIEW permet de supprimer une vue.
DROP VIEW [IF EXISTS] Vue 1 [, Vue 2, ...Vue N] [RESTRICT | CASCADE]
  • Si le mot-clé IF EXISTS est indiqué et que la vue (ou les vues) n'existe(nt) pas, un message d'erreur est généré.
  • Vue 1, Vue 2, ..., Vue N représentent la liste des vues à détruire.
  • Si le mot-clé RESTRICT est indiqué, la vue n'est pas supprimée dans le cas où celle-ci est en cours d'utilisation.
  • Si le mot-clé CASCADE est indiqué, la vue est supprimée ainsi que les vues dépendantes.
CREATE MATERIALIZED VIEW
Une vue matérialisée est une vue persistante : un fichier est créé sur disque avec le contenu de la vue. Cette vue pourra être manipulée plus tard par une autre application que celle qui l'a créée.
La fonction CREATE MATERIALIZED VIEW permet de créer une vue matérialisée.
CREATE MATERIALIZED VIEW Vue [ ( Alias 1, Alias 2, ...Alias N) ]
AS instruction SELECT [WITH [ NO ] DATA]
  • Le mot-clé WITH DATA crée une vue avec les données.
  • Le mot-clé WITH NO DATA crée une vue vide sans les données.
Remarque
  • Ce type de requête ne peut pas être créé avec l'assistant de l'éditeur de requêtes.
  • Ces requêtes ne peuvent pas fonctionner en HFSQL Classic ni avec les Connecteurs Natifs.
DROP MATERIALIZED VIEW
La fonction DROP MATERIALIZED VIEW permet de supprimer physiquement sur le disque une vue matérialisée.
DROP MATERIALIZED VIEW [IF EXISTS] Vue 1 [, Vue 2, ...Vue N] [RESTRICT | CASCADE]
  • Si le mot-clé IF EXISTS est indiqué et que la vue (ou les vues) n'existe(nt) pas, un message d'erreur est généré.
  • Vue 1, Vue 2, ..., Vue N représentent la liste des vues à détruire.
  • Si le mot-clé RESTRICT est indiqué, la vue n'est pas supprimée dans le cas où celle-ci est en cours d'utilisation.
  • Si le mot-clé CASCADE est indiqué, la vue est supprimée ainsi que les vues dépendantes.
REFRESH MATERIALIZED VIEW
La fonction REFRESH MATERIALIZED VIEW permet d'actualiser le contenu sur le disque d'une vue matérialisée. La vue est recalculée dans sa totalité.
REFRESH MATERIALIZED VIEW Vue [WITH [ NO ] DATA]
  • Le mot-clé WITH DATA actualise la vue avec les nouvelles données.
  • Le mot-clé WITH NO DATA actualise la vue vide sans les données.
OPTIMIZE TABLE
La fonction OPTIMIZE TABLE permet de réorganiser et réindexer un fichier de données et de reconstruire les index de ce fichier. Cette opération permet notamment d'améliorer les performances.
Cette fonction est équivalente à utiliser la fonction WLangage HRéindexe pour la réorganisation et réindexation d'un fichier de données.
OPTIMIZE TABLE NomFichier
NomFichier représente le nom du fichier à réorganiser.
Remarque :
  • Cette fonction est bloquante : le fichier de données n'est pas accessible durant l'exécution de la fonction. Il faut s'assurer que le fichier n'est pas en cours d'utilisation lors de l'appel de la fonction.
  • Cette fonction ne peut pas être utilisée avec les Connecteurs Natifs.
  • Par défaut, la réindexation effectuée correspond aux paramètres suivants : réindexation normale, réindexation des index full text, réindexation en tâche de fond, avec un taux de densité de 80%. Pour utiliser d'autres paramètres, utilisez la fonction HRéindexe.
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
UPDATE avec une autre table dans le SET
Comme ce cas n'est pas documenté (juste les syntaxes interdites...), ce qui fonctionne:

UPDATE TableA, TableB
SET TableA.valeur = TableB.valeur
WHERE TableA.id = TableB.id

pour setter les champs "valeur" de "TableA" avec "valeur" de "TableB" pour les enregistrements qui ont le même "id"
VincentRG
10 juin 2021

Dernière modification : 05/04/2024

Signaler une erreur ou faire une suggestion | Aide en ligne locale