Deprecated feature

Crear sentencias SQL directas

Bajo ciertas circunstancias, es posible que tenga que ejecutar las sentencias para seleccionar, actualizar, eliminar o recuperar datos, independientemente del modelo de datos. Por ejemplo, una operación empresarial puede insertar o eliminar registros de las tablas de datos que no se hayan definido en el modelo lógico. Otro ejemplo puede ser un caso en el que se actualicen varios objetos de datos, y resulte más eficiente emitir una sentencia SQL directa en lugar de utilizar la capa de servicios de datos para recuperar y actualizar cada objeto. En estos casos, puede crear sentencias SQL directas, que se almacenan en un archivo de plantilla de consulta cuyo nombre es especial.

Por qué y cuándo se efectúa esta tarea

Las sentencias SQL directas se ejecutan directamente, utilizando la clase JDBCQueryService. Todas las sentencias SQL directas deben aparecer en la sección SQL_STATEMENT de un archivo llamado wc-query-utilities.tpl. Esta sección es la única sección que puede contener sentencias select que utilizan funciones de agregación como, por ejemplo, sum() o avg(), ya que el resultado de dichas consultas no se correlacionan con objetos Java físicos en función de los metadatos relacionales de objeto.

Nota: En la misma transacción, nunca lea ni actualice los mismos datos utilizando la clase JDBCQueryService junto con alguna de las clases siguientes: PhysicalDataContainer, ChangesBusinessObjectMediator o ReadBusinessMediator.
Cuando cree sentencias SQL directas en el entorno del espacio de trabajo, debe tener en cuenta las condiciones siguientes:
  1. Los nombres de tabla deben ser la única información de identificación que debe utilizar cuando haga referencia a las tablas. Es decir, no debe incluir los nombres de esquema como parte del nombre de la tabla cuando haga referencia a éstas. Por ejemplo, TABLE_NAME es un nombre de tabla aceptable, pero SCHEMA_NAME.TABLE_NAME no lo es.
  2. La cláusula WHERE de una sentencia SQL puede ser cualquier condición de búsqueda de SQL válida y no debe utilizar ninguna función SQL de base de datos. Por ejemplo, IN o = son condiciones de búsqueda aceptables, mientras que MIN o MAX no lo son.
  3. Las sentencias SQL deben tener el formato de una sentencia SQL completa, y no deben llamar a los procedimientos almacenados como, por ejemplo, GetItems o ShipItems.

Para crear sus propias consultas SQL directas:

Procedimiento

  1. Cree una carpeta WC\config\com.ibm.commerce.servicemodule-ext, si todavía no existe ninguna:
    1. Pulse el botón derecho del ratón en la carpeta WC\config\com.ibm.commerce.servicemodule-ext. Debe crear la carpeta en el directorio -ext. No modifique directamente las plantillas de consulta de HCL Commerce.
  2. Cree un archivo de plantilla de consulta personalizado para sus sentencias SQL directas:
    1. Pulse Nuevo > Otros > Simple > Archivo > Siguiente
    2. Asigne un nombre al archivo de plantilla de consulta personalizado: wc-query-utilities.tpl.
    3. Pulse Finalizar.
  3. Si fuera necesario, cree definiciones de símbolo dentro de un bloque BEGIN_SYMBOL_DEFINITIONS/END_SYMBOL_DEFINITIONS. Las definiciones de símbolos se explican en detalle en la descripción de la sintaxis Archivo de plantilla de consulta.
  4. Cree un bloque BEGIN_SQL_STATEMENT / END_SQL_STATEMENT vacío, utilizando las líneas siguientes:
    BEGIN_SQL_STATEMENT
      name= myStatementName
      base_table= BASETABLENAME
      sql= 
    END_SQL_STATEMENT  
    
    1. Establezca myStatementName en el nombre de la sentencia SQL. Utilizará este nombre cuando llame a la sentencia directamente en su código Java mediante la clase JDBCQueryService.
    2. Establezca BASETABLENAMEen el nombre de la tabla base a la que esté accediendo.
  5. Añada la sentencia SQL mediante la parte sql= del bloque. Dicha sentencia SQL debe seguir uno de los formatos de sentencia soportados mostrados en la tabla siguiente:
    Tipo de sentenciaFormatos de sentencia soportados
    Sentencia select SELECT FROM TABLE_NAME [WHERE <SEARCH CONDITION>]
    Sentencia update UPDATE TABLE_NAME SET COL_1=<VALUE EXPRESSION 1>, COL_2=<VALUE EXPRESSION 2>, ... COL_N=<VALUE EXPRESSION N> [WHERE <SEARCH CONDITION>]
    Sentencia delete DELETE FROM TABLE_NAME [WHERE <SEARCH CONDITION>]
    Sentencia insert
    1. INSERT INTO TABLE_NAME [(COL_1, COL_2, ... COL_N)] VALUES (<VALUE EXPRESSION 1>, <VALUE EXPRESSION 2>, ... <VALUE EXPRESSION N>)
    2. INSERT INTO TABLE_NAME [(COL_1, COL_2, ... COL_N)] SELECT COL_1, COL_2, ... FROM TABLE_NAME T1 [WHERE <SEARCH CONDITION>]
    <VALUE EXPRESSION> puede ser un valor literal, o cualquier expresión que se evalúe en un valor (como, por ejemplo, un bloque de sentencia CASE). No obstante, <VALUE EXPRESSION> no puede ser una sentencia subselect.
    Nota: Si existe alguna serie que contenga palabras clave SQL en los datos de la variable <VALUE EXPRESSION>, o en los nombres de la tabla/columna personalizada, el analizador JDBC SQL interno leerá la sentencia SQL de forma incorrecta, y emitirá una excepción. Puede utilizar marcadores de parámetro en lugar de series de literales, tal como se explica en Parámetros SQL.

    <SEARCH CONDITION> no tiene las restricciones que se aplican a <VALUE EXPRESSION>, y puede ser cualquier condición de búsqueda SQL válida.

Ejemplo

El ejemplo siguiente muestra una sentencia SQL update directa soportada, que sigue el formato 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