- Lecture des données lors de l'initialisation
- Texte de la requête SQL
- Exécuter une requête SQL paramétrée
- Injection SQL : Comment s'en prémunir ?
- Insertion de données binaires
- Jointures
- Pourquoi utiliser la constante hRequêteSansCorrection ?
- Condition sur une clé composée dans une requête SQL
- Requêtes sur des fichiers de données HFSQL
- Optimisation pour exécuter plusieurs fois une même requête (Accès natifs Oracle et SQL Server uniquement)
- Spécifier et récupérer des valeurs lors de l'exécution d'une requête (cas des procédures stockées)
- Requêtes SQL (fonction HExécuteRequêteSQL ou exécution de requêtes SQL créées par l'éditeur de requêtes)
- Parcours des requêtes (fonction HLitPremier)
HExécuteRequêteSQL (Fonction) En anglais : HExecuteSQLQuery
Non disponible avec ce type de connexion
Initialise une requête écrite en langage SQL et déclare cette requête au moteur HFSQL. Cette requête peut correspondre : - au code SQL saisi directement dans la fonction HExécuteRequêteSQL.
- à une variable de type Requête SQL.
Le résultat de la requête pourra ensuite être parcouru. Si une requête de même nom existe déjà , cette requête est remplacée. Le résultat est re-calculé. Fonctionnalité spécifique à HFSQL : Les requêtes SQL exécutées sur des bases de données HFSQL Classic, Mobile ou Client/Serveur peuvent contenir des fonctions WLangage. Pour plus de détails, consultez Utiliser une fonction WLangage dans une requête SQL. Attention : Pour se positionner sur le premier enregistrement du résultat de la requête, utilisez par exemple la fonction HLitPremier. Pour libérer les ressources d'une requête saisie dans la fonction HExécuteRequêteSQL, utilisez : Remarque : une requête ne pourra pas être initialisée si : - le nom de la requête est déjà utilisée dans l'analyse en cours (nom de fichier de données ou nom défini par une des fonctions suivantes : HDéclare, HDéclareExterne, HDécritFichier).
- une erreur de syntaxe est trouvée dans la requête.
ReqClient est une Source de Données
HExécuteRequêteSQL(ReqClient, "SELECT NOM FROM CLIENT")
ReqTache est une Source de Données
HExécuteRequêteSQL(ReqTache, ...
"SELECT Tâche.Libellé FROM Tâche " +...
"WHERE WL.DateDifférence(Tâche.DateDébut, Tâche.DateFin) > 5")
REQ est une Source de Données
sMaReq est une chaîne = [
SELECT * FROM
CODEPOSTAUX
%1
]
sMaReq = ChaîneConstruit(sMaReq, "LIMIT 1, 10")
SI PAS HExécuteRequêteSQL(REQ, hRequêteDéfaut, sMaReq) ALORS
Erreur(HErreurInfo())
SINON
Info("La requête contient " + HNbEnr(REQ) + " enregistrements.")
FIN
Syntaxe
Exécuter une requête SQL (sans connexion) Masquer les détails
<Résultat> = HExécuteRequêteSQL(<Requête> [, <Mode>] , <Texte de la requête en SQL>)
<Résultat> : Booléen - Vrai si l'initialisation de la requête SQL a été effectuée,
- Faux dans le cas contraire. La fonction HErreurInfo permet d'obtenir plus d'informations sur le problème rencontré.
<Requête> : Chaîne de caractères ou Source de données - Nom de la requête qui va être exécutée. Ce nom permet de manipuler par programmation le résultat de <Texte de la requête en SQL>. Si une requête de même nom est déjà déclarée, elle est remplacée par la nouvelle requête.
- Nom de la variable de type Requête SQL contenant le code SQL de la requête. Dans ce cas, le paramètre <Texte de la requête en SQL> ne doit pas être précisé.
Ce type de variable n'est pas disponible.
<Mode> : Constante optionnelle de type Entier Option pour l'initialisation de la requête : | | hAvecFiltre (constante combinable avec les autres constantes) | Si ce paramètre est spécifié :- le résultat de la requête correspond à une sélection d'enregistrements de type filtre si le moteur HFSQL le permet. Sinon, le résultat de la requête est une vue HFSQL.
- les opérations suivantes ne sont pas possibles : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
- les rubriques de parcours spécifiées lors du parcours du résultat ne sont pas prises en compte.
- la loupe n'est pas disponible sur les tables liées à une requête.
- la fonction hNbEnr ne peut pas être utilisée sur les requêtes.
Attention : si cette option est précisée, l'utilisation de la constante hModifieFichier est automatique. Si ce paramètre n'est pas spécifié (par défaut) :- le résultat de la requête correspond à une vue HFSQL.
- il est possible de réaliser les opérations suivantes sur les requêtes : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
- les rubriques de parcours spécifiées lors du parcours du résultat sont prises en compte.
- la loupe est disponible sur les tables liées à une requête.
- la fonction hNbEnr peut être utilisée sur les requêtes.
| hAvecTransaction | Seules les requêtes d'écriture (INSERT, UPDATE et DELETE) sont exécutées dans une transaction.Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. La transaction est donc toujours terminée à la fin de l'exécution de la fonction HExécuteRequêteSQL. Pour les requêtes d'écriture, il n'y a pas de source de données : l'appel de la fonction HLibèreRequete est inutile. Si la requête ne peut pas se terminer normalement (blocage d'enregistrements, coupure de courant, ...), la transaction est annulée et les fichiers de données sont remis dans l'état avant l'exécution de la requête. Remarque : l'exécution de la requête pourra être fortement ralentie.
| hModifieFichier (constante combinable avec les autres constantes) | - Sur des fichiers de données HFSQL : Lors de la modification du résultat de la requête (fonctions HAjoute, HEcrit, HModifie, HRaye, HSupprime), ces modifications seront reportées dans les fichiers de données intervenant dans la requête.
Si cette option n'est pas précisée, seul le résultat de la requête est modifié. Pour plus de détails sur la modification du résultat d'une requête, consultez Modifier le contenu d'une requête. - Sur des fichiers de données non HFSQL, la constante hModifieFichier est inutile : les fichiers de données intervenant dans la requête sont automatiquement modifiés lors de la modification du résultat de la requête.
| hRequêteDéfaut (valeur par défaut) | Initialisation de la requête sans interruption. | hRequêteInterruptible | L'initialisation de la requête peut être interrompue avec la touche ECHAP.
| hRequêteSansCorrection | | hRequêteSansCorrectionHF | | hSansBind | | hSansSablier | Lors de la lecture du résultat de la requête, cette lecture peut être bloquée et un sablier apparaît par défaut. Cette constante permet de ne pas afficher de sablier dans ce cas.
| hSQLUnicode | Permet de spécifier que le texte de la requête doit être envoyé sous forme Unicode au serveur. | hTemporise | Pour les requêtes UPDATE et DELETE s'appliquant sur beaucoup d'enregistrements et étant relativement longues, cette constante permet de laisser la main aux autres applications utilisant les fichiers de données. Dans ce cas :- la requête s'exécute un peu plus lentement,
- le serveur de fichiers n'est pas saturé,
- les autres utilisateurs des fichiers de données peuvent continuer à y accéder sans rencontrer de blocage.
| hVérifieDoublon | Active la gestion des doublons pendant l'exécution de la requête. Si une erreur de doublons est détectée, la requête n'est pas exécutée. Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête. Remarque : l'exécution de la requête pourra être fortement ralentie.
| hVérifieIntégrité | Active la gestion de l'intégrité pendant l'exécution de la requête. Si une erreur d'intégrité est détectée, la requête n'est pas exécutée. Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête. Remarque : l'exécution de la requête pourra être fortement ralentie.
|
<Texte de la requête en SQL> : Chaîne de caractères Texte de la requête SQL à exécuter. Ce texte peut correspondre à une chaîne de caractères au format ANSI ou au format Unicode.
Ce paramètre n'est pas disponible si <Nom de la requête> correspond à une variable de type Requête SQL.
Exécuter une requête SQL via une connexion Masquer les détails
<Résultat> = HExécuteRequêteSQL(<Requête> [, <Connexion> [, <Mode>]] , <Texte de la requête en SQL>)
<Résultat> : Booléen - Vrai si l'initialisation de la requête SQL a été effectuée,
- Faux dans le cas contraire. La fonction HErreurInfo permet d'obtenir plus d'informations sur le problème rencontré.
<Requête> : Chaîne de caractères ou source de données - Nom de la requête qui va être exécutée. Ce nom permet de manipuler par programmation le résultat de <Texte de la requête en SQL>. Si une requête de même nom est déjà déclarée, elle est remplacée par la nouvelle requête.
- Nom de la variable de type Requête SQL contenant le code SQL de la requête. Dans ce cas, le paramètre <Texte de la requête en SQL> ne doit pas être précisé.
Ce type de variable n'est pas disponible.
<Connexion> : Chaîne de caractères optionnelle ou variable de type Connexion Connexion utilisée pour exécuter la requête. Cette connexion correspond : Si ce paramètre ne correspond pas à une connexion existante, <Résultat> est à Faux. <Mode> : Constante optionnelle de type Entier Option pour l'initialisation de la requête : | | hAvecFiltre (constante combinable avec les autres constantes) | Si ce paramètre est spécifié :- le résultat de la requête correspond à une sélection d'enregistrements de type filtre si le moteur HFSQL le permet. Sinon, le résultat de la requête est une vue HFSQL.
- les opérations suivantes ne sont pas possibles : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
- les rubriques de parcours spécifiées lors du parcours du résultat ne sont pas prises en compte.
- la loupe n'est pas disponible sur les tables liées à une requête.
- la fonction hNbEnr ne peut pas être utilisée sur les requêtes.
Attention : si cette option est précisée, l'utilisation de la constante hModifieFichier est automatique. Si ce paramètre n'est pas spécifié (par défaut) :- le résultat de la requête correspond à une vue HFSQL.
- il est possible de réaliser les opérations suivantes sur les requêtes : recherche sur le résultat de la requête, requête sur requête, vue sur requête, requête sur vue.
- les rubriques de parcours spécifiées lors du parcours du résultat sont prises en compte.
- la loupe est disponible sur les tables liées à une requête.
- la fonction hNbEnr peut être utilisée sur les requêtes.
| hAvecTransaction | Seules les requêtes d'écriture (INSERT, UPDATE et DELETE) sont exécutées dans une transaction.Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. La transaction est donc toujours terminée à la fin de l'exécution de la fonction HExécuteRequêteSQL. Pour les requêtes d'écriture, il n'y a pas de source de données : l'appel de la fonction HLibèreRequete est inutile. Si la requête ne peut pas se terminer normalement (blocage d'enregistrements, coupure de courant, ...), la transaction est annulée et les fichiers de données sont remis dans l'état avant l'exécution de la requête. Remarque : l'exécution de la requête pourra être fortement ralentie.
| hModifieFichier (constante combinable avec les autres constantes) | - Sur des fichiers de données HFSQL : Lors de la modification du résultat de la requête (fonctions HAjoute, HEcrit, HModifie, HRaye, HSupprime), ces modifications seront reportées dans les fichiers de données intervenant dans la requête.
Si cette option n'est pas précisée, seul le résultat de la requête est modifié. Pour plus de détails sur la modification du résultat d'une requête, consultez Modifier le contenu d'une requête. - Sur des fichiers de données non HFSQL, la constante hModifieFichier est inutile : les fichiers de données intervenant dans la requête sont automatiquement modifiés lors de la modification du résultat de la requête.
| hRequêteDéfaut (valeur par défaut) | Initialisation de la requête sans interruption. | hRequêteInterruptible | L'initialisation de la requête peut être interrompue avec la touche ECHAP.
| hRequêteSansCorrection | | hRequêteSansCorrectionHF | | hSansBind | | hSansSablier | Lors de la lecture du résultat de la requête, cette lecture peut être bloquée et un sablier apparaît par défaut. Cette constante permet de ne pas afficher de sablier dans ce cas.
| hSQLUnicode | Permet de spécifier que le texte de la requête doit être envoyé sous forme Unicode au serveur. | hTemporise | Pour les requêtes UPDATE et DELETE s'appliquant sur beaucoup d'enregistrements et étant relativement longues, cette constante permet de laisser la main aux autres applications utilisant les fichiers de données. Dans ce cas :- la requête s'exécute un peu plus lentement,
- le serveur de fichiers n'est pas saturé,
- les autres utilisateurs des fichiers de données peuvent continuer à y accéder sans rencontrer de blocage.
| hVérifieDoublon | Active la gestion des doublons pendant l'exécution de la requête. Si une erreur de doublons est détectée, la requête n'est pas exécutée. Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête. Remarque : l'exécution de la requête pourra être fortement ralentie.
| hVérifieIntégrité | Active la gestion de l'intégrité pendant l'exécution de la requête. Si une erreur d'intégrité est détectée, la requête n'est pas exécutée. Cette constante force la constante hAvecTransaction. Une transaction est démarrée, les enregistrements sont bloqués en écriture pendant l'exécution de la requête et débloqués à la fin de son exécution, que la requête échoue ou non. Si l'application est arrêtée pendant l'exécution de la requête (coupure de courant par exemple), la transaction sera annulée à la prochaine utilisation des fichiers de données de la requête. Remarque : l'exécution de la requête pourra être fortement ralentie.
|
<Texte de la requête en SQL> : Chaîne de caractères Texte de la requête SQL à exécuter. Ce texte peut correspondre à une chaîne de caractères au format ANSI ou au format Unicode.
Ce paramètre n'est pas disponible si <Nom de la requête> correspond à une variable de type Requête SQL. Remarques Lecture des données lors de l'initialisation Selon la requête (tris, groupes, ...), les données peuvent ou non être lues au moment de l'initialisation de la requête. Remarque : La propriété ExécutionTerminée permet de savoir si le remplissage de la requête est terminé (et donc si les lectures peuvent être effectuées sans blocage). Pour accéder aux rubriques de la requête, il faut déclarer une variable de type Source de données (voir Exemple). La requête est alors libérée automatiquement lorsque la variable est détruite. Pour forcer la libération des ressources de cette requête, utilisez : Texte de la requête SQL Si un nom de fichier de données ou un nom de rubrique contient des espaces, il est nécessaire d'entourer ces noms par des crochets dans le texte de la requête. Par exemple : SELECT [Mon Fichier1].MaRubrique, [Mon Fichier1].[Ma rubrique1], MonFichier2.[Ma clé1]
FROM [Mon Fichier1], MonFichier2
WHERE [Mon Fichier1].[Ma clé1] = MonFichier2.[Ma clé1] Exécuter une requête SQL paramétrée Une requête SQL peut contenir des paramètres. Pour exécuter ce type de requête SQL avec la fonction HExécuteRequêteSQL, il faut : - Dans le texte de la requête SQL, définir les différents paramètres en utilisant la notation {Nom du paramètre}. Par exemple :
"SELECT * FROM client WHERE nom={p_nom}" - Définir une variable de type Source de données. Le nom de cette variable doit correspondre au paramètre <Nom de la requête> de la fonction HExécuteRequêteSQL.
Exemple :
MaRequête est une Source de Données
- Spécifier la valeur des paramètres, via la syntaxe suivante :
<Variable Source de données>.<Nom Paramètre1> = xxx <Variable Source de données>.<Nom Paramètre2> = xxx <Variable Source de données>.<Nom Paramètre3> = xxx Exemple :
MaRequête.p_nom = "Dupont"
- Exécuter la requête SQL avec la fonction HExécuteRequêteSQL. Exemple :
HExécuteRequêteSQL(MaRequête, "SELECT * FROM client WHERE nom={p_nom}")
Remarque : A chaque exécution de la requête paramétrée, la structure des paramètres de la requête est ré-initialisée. Injection SQL : Comment s'en prémunir ? L'injection SQL est une technique de piratage consistant à injecter du code SQL dans les paramètres des requêtes, forçant ainsi l'exécution de code SQL non désiré. Pour éviter l'injection SQL lors de l'exécution de requêtes via la fonction HExécuteRequêteSQL, il est nécessaire d'utiliser des requêtes paramétrées et de ne pas concaténer des chaînes pour construire la requête. Exemple :
sdReq est une Source de Données
HExécuteRequêteSQL(sdReq, "SELECT * FROM client WHERE nom = '" + SAI_Nom + "'")
sdReq est une Source de Données
sdReq.p_nom = SAI_Nom
HExécuteRequêteSQL(sdReq, "SELECT * FROM client WHERE nom={p_nom}")
L'utilisation de paramètres permet de ne pas interpréter le contenu comme étant du code SQL. Cette technique rend donc impossible l'injection de code SQL et élimine de nombreux risques de piratage. Insertion de données binaires Lors de l'insertion de données par INSERT ou UPDATE, si une rubrique mémo doit être affectée avec des données binaires pouvant contenir le caractère \0 (code ASCII zéro), il faut placer les données dans un buffer hexadécimal. Exemple : Requête SQL est une chaîne
source de données est une Source de Données
b est un Buffer = "Données binaires incluant "+Caract(0)+" (zéro binaire)"
Requête SQL = "INSERT INTO Produit (Photo) " + ...
"VALUES (UNHEX('" + BufferVersHexa(b, SansRegroupement, SansLigne)+"'))"
HExécuteRequêteSQL(source de données, hRequêteDéfaut, Requête SQL)
Condition sur une clé composée dans une requête SQL Pour définir une condition sur une clé composée dans une requête SQL, il faut préciser les conditions de chacune des composantes de la clé. Il ne faut pas tenter d'affecter directement la clé composée avec une valeur (en effet, les clés composées sont enregistrées sous forme de valeur binaire). Exemple : La clé composée des rubriques NOM et PRENOM (rubrique NOMPRENOM) :
SELECT MonFichier.MaRubrique, MonFichier.MaRubrique1
FROM MonFichier
WHERE NomFichier.Nom = "Dupont" AND NomFichier.Prénom = "Florence" Classification Métier / UI : Code métier
Documentation également disponible pour…
|
|
|