Aller au contenu

$sql.prepareStatement

Description

Crée un prepared statement et retourne ce dernier en tant qu'objet pojo en vue d'une utilisation future.

Remarque concernant l'utilisation

Veuillez lire ce qui suit avant d'envisager d'utiliser les méthodes $sql.prepareStatement, $sql.releaseStatement, $sql.addBatch,$sql.executeBatchet$sql.clearBatch`.

Ces méthodes nécessitent une connexion durable à la base de données. Cela signifie que l'application va monopoliser une connexion à la base de données entre la création du prepared statement et sa libération via $sql.releaseStatement. Cela peut être un problème si le nombre de connexions à la DB est limité et que plusieurs threads peuvent fonctionner en parallèle.

D'autre part, l'intérêt principal de $sql.prepareStatement est de permettre d'utiliser des batchs. Cependant dans les faits et pour une utilisation normale, le recours aux batchs ne présente pas de gain notable de performances en comparaison d'une utilisation intelligente des méthodes SQL standard. Par exemple, il sera généralement plus efficace de regrouper des insertions dans un seul statement du genre

insert into foo(...) values(...),(...),(...)

plutôt que de passer en série des appels à $sql.addBatch.

Syntaxe

$sql.prepareStatement( query [ , options ] )

Paramètres

query string
Requête servant de base au prepared statement
options map

Map d'options. Les options reconnues sont:

autocommit boolean
Flag true/false permettant d'activer/désactiver l'auto-commit. Par défaut l'auto-commit est actif.
type string
Indication passée au processeur pour renseigner sur le type de requête. Le type de requête influence sur la valeur de retour de la requête: une requête de type SELECT retourne un resultset contenant les données recherchées alors qu'une requête de type INSERT retourne les valeurs de clés auto-générées. Ainsi, on pourra indiquer que la requête est de type "insert" au moyen du terme insert.
connection string
Nom de connexion de laquelle exécuter la requête. Le nom doit faire référence à une connexion définie dans le fichier de configuration

Retour

La méthode retourne l'identifiant généré pour le prepared statement référencé en cache. L'identifiant en question est un UUID.

Exemple

Exemple de base. Notez l'utilisation de try/finally et l'exécution de la méthode $sql.releaseStatement dans la clause finally afin de s'assurer qu'elle soit exécutée dans tous les cas.

1
2
3
4
5
6
7
8
9
var psref = $sql.prepareStatement(`select ?`);
try {
  for (var i = 0; i < 10; ++i) {
    $logger.info($sql.select(psref, [ i ]));
  }
}
finally {
  $sql.releaseStatement(psref);
}

Exemple plus avancé dans lequel on génère plusieurs prepared statements à la fois.

var pskInfoVendeur = $sql.prepareStatement(`select ResumeText
                                            from Vendeur
                                            where idVendeur=?`::T),
    pskTotArticles = $sql.prepareStatement(`select count(*)
                                            from Article
                                            where idVenteEchange=?
                                              and idVendeur=?`::T),
    pskNumLabels = $sql.prepareStatement(`select count(*)
                                          from Article
                                          where idVenteEchange=?
                                            and idVendeur=?
                                            and (? = 1 or coalesce(Printed, 0) = 0)
                                            and Statut!='refuse'`::T);
try {
    for (var row : listerVendeurs(venteechange, premiervendeur, derniervendeur, !allowreprint, '')) {
      var nombreEtiquettes = $sql.select(pskNumLabels, [ (number) venteechange, row[0], (number) allowreprint ] );

      if (filtreImpression && nombreEtiquettes == 0) continue;

      if (counter++ > 0) $response.addContent(",");
      $response.addContent(`{ "vendeur": ` & $json.stringify($sql.select(pskInfoVendeur, [ row[0] ])) &
                           `, "totarticles": ` & $json.stringify($sql.select(pskTotArticles, [ (number) venteechange, row[0] ] )) &
                           `, "numlabels": ` & $json.stringify(nombreEtiquettes) & `}`);
    }
}
finally {
    $sql.releaseStatement([pskInfoVendeur, pskTotArticles, pskNumLabels]);
}