Sintaxis de consulta de EJB en SQL

La sintaxis para realizar consultas de EJB en SQL depende de la base de datos. Utilice esta información a modo de referencia para descubrir en qué sentencia SQL se traduce una consulta de EJB al ejecutarla en programas de fondo de proveedores de base de datos distintos.

Este tema de referencia puede resultar de utilidad para los usuarios que:
  • Determinan el despliegue en una base de datos no compatible. Utilice este tema de referencia de ayuda para elegir un programa de fondo de un proveedor de base de datos que más se aproxime a su entorno de despliegue no compatible.
  • Determinan utilizar el ID de programa de fondo SQL92 o SQL99 desechado. Utilice este tema de referencia como apoyo para determinar qué programa de fondo debe utilizar, en un futuro cercano, cuando ya no estén disponibles los programas de fondo SQL92 y SQL99.

Los ID de programa de fondo de proveedores de base de datos no compatibles

A continuación figura una lista de nombres de proveedores de base de datos no compatibles que puede especificar para desplegar la aplicación:
Nota: Utilice el ID de programa de fondo como valor de argumento de dbvendor cuando ejecute el mandato ejbdeploy. Para obtener más información sobre el mandato ejbdeploy, consulte el tema El mandato ejbdeploy.
Tabla 1. Los ID de programa de fondo de proveedores de base de datos compatibles
Proveedor de base de datos ID de programa de fondo Descripción
DB2 DB2UDB_V81 DB2 Universal Database V8.1 para Windows y UNIX
DB2UDB_V82 DB2 Universal Database V8.2 para Windows y UNIX
DB2UDBOS390_V7 DB2 Universal Database para z/OS y OS/390, V7
DB2UDBOS390_V8 DB2 Universal Database para z/OS y OS/390, V8
DB2UDBISERIES DB2 para iSeries
DB2UDBISERIES_V52 DB2 para iSeries, V5R2
DB2UDBISERIES_V53 DB2 para iSeries, V5R3
Oracle ORACLE_V8 Oracle, V8.0
ORACLE_V9I Oracle, V9i
ORACLE_V10G Oracle, V10g
Informix INFORMIX_V73 Informix Dynamic Server.2000, V7.3
INFORMIX_V93 Informix Dynamic Server.2000, V9.3
INFORMIX_V94 Informix Dynamic Server.2000, V9.4
Sybase SYBASE_V1200 Sybase Adaptive Server Enterprise, V12.0
SYBASE_V1250 Sybase Adaptive Server Enterprise, V12.5
SQL Server MSSQLSERVER_2000 Microsoft SQL Server 2000
MSSQLSERVER_V7 Microsoft SQL Server, V7.0
Cloudscape CLOUDSCAPE_V5 Cloudscape, V5.1
Derby DERBY_V10 Derby V10
Se desechan los siguientes ID de programa de fondo:
  • SQL92 (1992 SQL Standard)
  • SQL99 (1999 SQL Standard)
Aunque se desechan SQL92 y SQL99, las opciones SQL92 y SQL99 siguen estando disponibles. Si utiliza la opción SQL92 o SQL92, se generará código SQL para Cloudscape V5.

Especificar nombres de columna en sentencias SQL

La sintaxis para especificar nombres de columna en SQL depende de la base de datos. Para DB2, Oracle y Cloudscape, los nombres de columnas, tablas y correlaciones se encierran entre comillas dobles para incluir los nombres sensibles a las mayúsculas/minúsculas. A continuación figura un ejemplo de una sentencia SQL traducida para DB2:

 SELECT q1."IDEMP", q1."NOMBRE",q1."SUELDO" FROM Emp q1

No obstante, Informix, SQL Server y Sybase no encierran los nombres de columna entre comillas dobles. A continuación figura un ejemplo de una sentencia SQL traducida para Sybase:

SELECT q1.IDEMP, q1.NOMBRE, q1.SUELDO  FROM Emp q1

Funciones de base de datos

En los apartados siguientes se enumeran las funciones de base de datos que puede utilizar en consultas de EJB y se muestra la sintaxis de SQL traducida para el programa de fondo del proveedor de base de datos especificado:

Unión exterior

La sintaxis para realizar una unión exterior en SQL depende de la base de datos.

Todos los proveedores de base de datos admitidos (excepto Oracle V8) son compatibles ANSI (American National Standards Institute) con la sintaxis de unión exterior. A continuación se detalla la sintaxis para realizar una unión exterior de sentencia SQL:
SELECT ...  FROM t1 LEFT OUTER JOIN t2 ON (t1.col1=t2.col2)
Para Oracle, se utiliza la sintaxis "+" en la cláusula WHERE de la sentencia SQL:
SELECT ... FROM t1, t2 WHERE t1.col1=t2.col2 (+)

Funciones escalares

La consulta de EJB contiene funciones escalares para realizar conversiones de tipo, manipulación de series y para manipular valores de fecha y hora. Para obtener más información sobre la lista de funciones escalares, consulte el tema Consulta EJB: Funciones escalares.

En la columna izquierda de la tabla se enumeran las funciones escalares que puede contener una consulta de EJB. A la derecha de la columna de función de consulta de EJB, se enumera la sintaxis de SQL que se transfiere a los proveedores de base de datos de programa de fondo respectivos en la cabecera de cada columna. Las celdas vacías que no contienen texto significa que la función de consulta de EJB no se puede transferir a un proveedor de base de datos concreto y, como consecuencia, se produce una condición de error Cannot push down query (No se puede transferir la consulta).

Tabla 2. Funciones escalares de consultas de EJB y lo que la sintaxis SQL transfiere a cada programa de fondo
Función de consulta de EJB DB2 OS390 DB2 Oracle Informix Sybase SQL Server Cloudscape V5.1 Derby V10
ABS abs abs abs abs abs abs abs abs
SQRT sqrt sqrt sqrt sqrt sqrt sqrt sqrt sqrt
CONCAT concat concat concat || + + || concat
LENGTH length length length length char_length len char_length length
LOCATE locate locate instr locate charindex charindex locate locate
SUBSTRING substr substr substr substr substring substring substr substr
MOD mod mod mod mod mod % mod mod
ucase upper upper upper upper upper upper upper upper
upper upper upper upper upper upper upper upper upper
lcase lower lower lower lower lower lower lower lower
lower lower lower lower lower lower lower lower lower
char char char to_char   char char   char
bigint   bigint           bigint
date date date           date
decimal decimal decimal            
double   double           double
float float float           float
integer integer integer           integer
real real real           real
smallint   smallint           smallint
time time time           time
timestamp timestamp timestamp           timestamp
digits digits digits           digits
day day day           day
days days days           days
hour hour hour           hour
microsecond microsecond microsecond           microsecond
minute minute minute           minute
month month month           month
second second second           second
year year year           year

Aritmética y comparaciones de fecha y hora

Para obtener nociones generales sobre la aritmética de comparación de fecha y hora consulte el tema Valores y comparaciones de fecha y hora de WebSphere InfoCenter.

Se proporciona soporte en la familia de productos DB2 para utilizar la representación de series en valores de DATE, TIME y TIMESTAMP; y debe especificar las operaciones de aritmética y comparación en el lenguaje de consulta de EJB. Para obtener detalles sobre los valores de DATE, TIME y TIMESTAMP en DB2, consulte el tema Valores de fecha y hora.

Para bases de datos que no son de la familia de productos DB2, no se ofrece soporte para utilizar la representación de series en valores de DATE, TIME y TIMESTAMP; y debe especificar las operaciones de aritmética y comparación en el lenguaje de consulta de EJB. En cambio, puede representar los valores de fecha (date), hora (time) o indicación de la hora (timestamp) en milisegundos utilizando un tipo de datos long de Java. El literal de fecha, hora o indicación de la hora debe ser numérico. Para generar un valor en milisegundos, puede utilizar la clase java.util.Calendar. Utilice la interfaz java.util.Calendar para comparar distintos objetos Calendar.

Ejemplos
En la tabla siguiente, para cada uno de los proveedores de base de datos se enumera un ejemplo de la consulta de EJB y de la consulta SQL traducida.
Nota: El tipo de datos de emp_ts es Calendar.
Tabla 3. Representación de la fecha, la hora y la indicación de la hora: ejemplos de consulta de EJB y sus sentencias SQL transferidas para los distintos proveedores de base de datos.
Proveedor de base de datos de programa de fondo Sentencia de consulta de EJB de ejemplo Sentencia de consulta SQL traducida
DB2 SELECT e FROM EmpBean e WHERE e.emp_ts=71039082 SELECT q1."no", q1."name", q1."emp_ts" FROM userid.iEmp q1 WHERE q1."emp_ts" = '1970-1-1-11.43.59.082'
Oracle SELECT e FROM EmpBean e WHERE e.emp_ts=71039082 SELECT q1."no", q1."name", q1."emp_ts" FROM userid.iEmp q1 WHERE q1."emp_ts" = TO_DATE ( '1970-1-1-11.43.59','YYYY-MM-DD-HH24.MI.SS')
Informix SELECT e FROM EmpBean e WHERE e.emp_ts>71039082 SELECT q1.no, q1.name, q1.emp_ts FROM userid.iEmp q1 WHERE q1.emp_ts > DATETIME (1970-1-1 11:43:59.082) YEAR TO FRACTION)
Cloudscape SELECT e FROM EmpBean e WHERE e.emp_ts<71039082 SELECT q1."no", q1."name", q1."emp_ts" FROM userid.iEmp q1 WHERE q1."emp_ts" < '1970-1-1-11.43.59.082'
SQL Server SELECT e FROM EmpBean e WHERE e.emp_ts=71039082 SELECT q1.no, q1.name, q1.emp_ts FROM userid.iEmp q1 WHERE q1.emp_ts = 'Jan 1 1970 11:43:59.82 AM'
Sybase SELECT e FROM EmpBean e WHERE e.emp_ts=71039082 SELECT q1.no, q1.name,emp_ts FROM userid.iEmp q1 WHERE q1.emp_ts = 'Jan 1 1970 11:43:59.82 AM'

Funciones CONCAT, LOCATE, LENGTH y SUBSTR

El operador de concatenación (CONCAT) enlaza dos operandos de serie para formar una expresión de serie. Los operandos de concatenación deben ser series compatibles. El operador locate devuelve la posición de inicio de la primera aparición de una serie de búsqueda dentro de una serie de origen. El operador length devuelve la longitud de un valor. El operador substring (SUBSTR) devuelve una subserie de una serie.

DB2 frente a otros proveedores de base de datos

Para DB2, las funciones que aceptan los argumentos de entrada como parámetros de entrada, por ejemplo, las funciones: SUBSTR, CONCAT, LOCATE y LENGTH, requieren el uso de la sintaxis de CAST, pero otros proveedores de base de datos no requieren CAST para sus funciones.

Ejemplo:

Considere la sentencia de consulta de EJB de ejemplo con el argumento de entrada que tiene un parámetro de entrada de tipo java.lang.String:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith'  {_varchar}
A continuación figura la sentencia SQL traducida para DB2 Universal Database en z/OS u OS/390:
SELECT  q1."EMPID",  q1."NAME" FROM Emp q1  WHERE  (CAST(SUBSTR ( ?, 1) AS VARCHAR(255)) = 
'John Smith')
A continuación figura la sentencia SQL traducida para Informix:
SELECT  q1.EMPID,  q1.NAME FROM Emp q1  WHERE  SUBSTR(?,1)='John Smith'
Puede observar que los otros proveedores de base de datos (en este ejemplo, Informix) no requieren la sintaxis de CAST para la función SUBSTR.

DB2 para iSeries y Universal Database para Windows y UNIX

Para DB2 para iSeries y Universal Database para Windows y UNIX, la función CONCAT convierte (CAST) el atributo de longitud combinado en 4000 ó 32672 como se muestra a continuación. Visite la página Centro de información de DB2 para obtener detalles.

Ejemplos:

Ejemplo nro. 1: convertir (CAST) los atributos de longitud combinados en VARCHAR(4000)

Sentencia de consulta de EJB de ejemplo:
 SELECT e  FROM EmpBean e WHERE concat(?1, 'ahmad') = 'deptahmad'  {_varchar}
La sentencia SQL traducida:
SELECT  q2."no",  q2."name" FROM userid.Emp q1 WHERE  (CAST(concat ( ?, 'ahmad') 
AS VARCHAR(4000)) = 'deptahmad')  
Ejemplo nro. 2: uso de marcadores de parámetro de tipo de datos VARCHAR
SELECT  d.name FROM DeptBean d WHERE CONCAT(?1,?2) = 'Firstname1' {_varchar,_varchar}
SELECT  q1."name" FROM userid.Deptc q1 WHERE  (CAST(concat (CAST(? AS VARCHAR(32672)), 
CAST(? AS VARCHAR(32672))) AS VARCHAR(4000)) = 'Firstname1')

DB2 Universal Database para z/OS y OS/390

Si hay un marcador de parámetro, las funciones que aceptan el argumento de entrada como parámetro de entrada, por ejemplo, las funciones: CONCAT, SUBSTR, LOCATE y LENGTH, requieren que se convierta (CAST) el atributo de longitud del marcador de parámetro como se define en el manual de consulta de DB2. Para obtener detalles, consulte los temas:

Ejemplo:

Sentencia de consulta de EJB de ejemplo:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith'  {_varchar}
La sentencia SQL traducida:
SELECT  q1."EMPID",  q1."NAME" FROM Emp q1  WHERE  (CAST(SUBSTR ( ?1, 1) AS VARCHAR(255)) = 
'John Smith') 

SQLJ

SQLJ permite incorporar sentencias SQL en programas Java™.

Se proporciona soporte de SQLJ para todos los programas de fondo de la familia de productos DB2, excepto DB2 para iSeries

Para obtener más detalles sobre SQLJ, consulte el tema Introducción a SQLJ.

Cláusula de predicado optimista

El objetivo del control de concurrencia optimista es minimizar el tiempo durante el cual un recurso determinado no estará disponible para que lo utilice otra transacción. Cuando se configura el propósito de acceso optimista, es necesario especificar los atributos que se desean incluir en el predicado optimista. El atributo se incluye en la cláusula WHERE de la sentencia SQL UPDATE:
UPDATE SET X = ? WHERE ID = ? AND X = ?

donde ID es la columna de clave primaria.

Para el ID de programa de fondo DB2UDBOS390_V8, si la columna de predicado optimista admite valores nulos, la consulta UPDATE producida utilizará la construcción "IS NOT DISTINCT FROM". Por ejemplo, si ID es la columna de clave primaria y NAME admite valores nulos, la consulta UPDATE producida será:

UPDATE SET NAME = ? WHERE ID = ? AND NAME IS NOT DISTINCT FROM ?

La sintaxis para obtener un bloqueo de actualización con la sentencia SELECT depende de la base de datos. Para obtener detalles sobre la sentencia SQL traducida para la cláusula UPDATE, consulte el tema Intento de acceso: Niveles de aislamiento y bloqueos de actualización.

Condiciones de uso | Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.