Deprecated feature

Création d'instructions SQL directes

Dans certaines circonstances, vous pourrez avoir besoin d'exécuter des instructions SQL pour sélectionner, mettre à jour, supprimer ou extraire des données indépendamment du modèle de données. Une opération commerciale peut, par exemple, insérer ou supprimer des enregistrements dans des tables de données non définies dans le modèle logique. Un autre exemple pourrait être la mise à jour d'objets de données multiples, auquel cas il serait plus efficace d'émettre une instruction SQL directe plutôt que d'utiliser la couche service de données afin d'extraire et de mettre à jour chaque objet. Vous pouvez créer pour ces scénarios des instructions SQL directes, stockées dans un fichier de modèle de requête portant un nom spécial.

Pourquoi et quand exécuter cette tâche

Les instructions SQL directes sont exécutées directement à l'aide de la classe JDBCQueryService. Toutes les instructions SQL directes doivent être situées dans la section SQL_STATEMENT d'un fichier nommé wc-query-utilities.tpl. Cette section est la seule pouvant contenir des instructions select utilisant des fonctions d'agrégation, comme sum() ou avg(), étant donné que le résultat de ces requêtes n'a pas de mappage par métadonnées objet-relationnel avec des objets Java physiques.

Remarque : Au sein d'une même transaction, vous ne devez jamais lire ou mettre à jour les mêmes données à l'aide de la classe JDBCQueryService en conjonction avec l'une des classes suivantes : PhysicalDataContainer, ChangesBusinessObjectMediator, ou ReadBusinessMediator.
Lors de la création d'instructions SQL directes personnalisées dans votre environnement d'espace de travail, vous devez prendre en compte les conditions suivantes :
  1. Les noms de table doivent être l'unique information d'identification pour le référencement de tables. En d'autres termes, les noms de schéma ne doivent pas être inclus avec le nom de la table lors de leur référencement. Par exemple, TABLE_NAME est un nom de table acceptable, ce qui n'est pas le cas de SCHEMA_NAME.TABLE_NAME.
  2. La clause WHERE dans une instruction SQL peut correspondre à n'importe quelle condition de recherche SQL valide et ne doit utiliser aucune fonction SQL de base de données.Par exemple, IN ou = sont des conditions de recherche acceptables, alors que MIN ou MAX ne le sont pas.
  3. Les instructions SQL doivent prendre la forme d'une instruction SQL complète et ne doivent pas appeler de procédures mémorisées telles que GetItems ou ShipItems.

Pour créer vos propres requêtes SQL directes, procédez comme suit :

Procédure

  1. Créez un dossier WC\config\com.ibm.commerce.servicemodule-ext, si celui-ci n'existe pas déjà :
    1. Cliquez avec le bouton droit sur le dossier WC\config\com.ibm.commerce.servicemodule-ext. Vous devez créer ce dossier dans le répertoire -ext. Ne modifiez pas directement les modèles de requête de HCL Commerce.
  2. Créez un fichier de modèle de requête personnalisé pour vos instructions SQL directes :
    1. Cliquez sur Nouveau > Autre > Simple > Fichier > Suivant
    2. Attribuez au fichier de modèle de requête personnalisé le nom : wc-query-utilities.tpl.
    3. Cliquez sur Terminer.
  3. Le cas échéant, créez des définitions de symboles dans un bloc BEGIN_SYMBOL_DEFINITIONS/END_SYMBOL_DEFINITIONS. Ces définitions sont discutées en détail dans la description de la syntaxe de Fichier de modèle de requête.
  4. Créez un bloc BEGIN_SQL_STATEMENT / END_SQL_STATEMENT vide à l'aide des lignes suivantes :
    BEGIN_SQL_STATEMENT
      name= myStatementName
      base_table= BASETABLENAME
      sql= 
    END_SQL_STATEMENT  
    
    1. Définissez myStatementName d'après le nom de votre instruction SQL. Ce nom sera utilisé lorsque vous appellerez l'instruction directement dans votre code Java à l'aide de la classe JDBCQueryService.
    2. Définissez BASETABLENAME d'après le nom de la table de base à laquelle vous accédez.
  5. Ajoutez votre code SQL dans la partie sql= du bloc. Ce code SQL doit suivre l'un des formats d'instruction pris en charge présenté dans le tableau suivant :
    Type d'instructionFormats d'instruction pris en charge
    Instruction SELECT SELECTIONNER PARMI TABLE_NAME [OU <SEARCH CONDITION>]
    Instruction de mise à jour METTRE À JOUR TABLE_NAME DEFINIR COL_1=<VALUE EXPRESSION 1>, COL_2=<VALUE EXPRESSION 2>, ... COL_N=<VALUE EXPRESSION N> [OU <SEARCH CONDITION>]
    Instruction de suppression SUPPRIMER DE TABLE_NAME [OU <SEARCH CONDITION>]
    Instruction d'insertion
    1. INSÉRER DE TABLE_NAME [(COL_1, COL_2, ... COL_N)] VALEURS (<VALUE EXPRESSION 1>, <VALUE EXPRESSION 2>, ... <VALUE EXPRESSION N>)
    2. INSERER DANS TABLE_NAME [(COL_1, COL_2, ... COL_N)] SELECTIONNER COL_1, COL_2, ... DE TABLE_NAME T1 [OU <SEARCH CONDITION>]
    <VALUE EXPRESSION> peut être un littéral ou une expression quelconque dont l'évaluation donne une valeur (telle qu'un bloc d'instruction CASE). Cependant, <VALUE EXPRESSION> ne peut pas être une instruction de sous-requête (subselect).
    Remarque : Si des chaînes littérales dans les données de votre <VALUE EXPRESSION>, ou de vos noms de colonne/table personnalisés, comportent des mots clés SQL, l'analyseur SQL JDBC interne lira incorrectement le code SQL et renverra une exception. Vous pouvez utiliser des marqueurs de paramètre au lieu de chaînes littérales, comme discuté dans la rubrique Paramètres SQL.

    <SEARCH CONDITION> n'est pas soumise aux restrictions s'appliquant à <VALUE EXPRESSION> et peut contenir une condition de recherche SQL valide quelconque.

Exemple

L'exemple suivant présente une instruction SQL directe de mise à jour prise en charge, suivant le format UPDATE <TABLE NAME> SET COL_1=<VALUE EXPRESSION 1> WHERE < SEARCH CONDITION>.

BEGIN_SQL_STATEMENT 
  name=IBM_Update_TopCatGroupSequence 
  base_table=CATTOGRP 
  sql= UPDATE CATTOGRP 
    SET CATTOGRP.SEQUENCE = ?sequence? 
    WHERE CATTOGRP.CATGROUP_ID IN (?catalogGroupID?) AND CATTOGRP.CATALOG_ID = ?catalogID? 
END_SQL_STATEMENT