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.
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 |
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
La sintaxis para realizar una unión exterior en SQL depende de la base de datos.
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 (+)
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).
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 |
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.
EjemplosProveedor 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' |
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:
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)
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:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith' {_varchar}
SELECT q1."EMPID", q1."NAME" FROM Emp q1 WHERE (CAST(SUBSTR ( ?1, 1) AS VARCHAR(255)) = 'John Smith')
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.
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.