
Crear sentencias SQL directas
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.
- 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.
- 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. - 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
-
Cree una carpeta WC\config\com.ibm.commerce.servicemodule-ext, si todavía no existe ninguna:
- 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.
-
Cree un archivo de plantilla de consulta personalizado para sus sentencias SQL directas:
- Pulse
- Asigne un nombre al archivo de plantilla de consulta personalizado: wc-query-utilities.tpl.
- Pulse Finalizar.
- 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.
-
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
- 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.
- Establezca BASETABLENAMEen el nombre de la tabla base a la que esté accediendo.
-
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 sentencia Formatos 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 - INSERT INTO TABLE_NAME [(COL_1, COL_2, ... COL_N)] VALUES (<VALUE EXPRESSION 1>, <VALUE EXPRESSION 2>, ... <VALUE EXPRESSION N>)
- 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