SQL 的 EJB 查询语法
- 选择针对不受支持的数据库进行部署。使用此参考主题帮助选择与不受支持的部署环境紧密匹配的有效数据库供应商后端标识。
- 选择使用不推荐使用的 SQL92 或 SQL99 后端标识。使用此参考主题帮助确定在不久的将来,当不推荐使用的 SQL92 和 SQL99 后端不再可用时,应该使用什么后端。
受支持的数据库供应商后端标识
以下是受支持的数据库供应商名称列表,您可以指定要部署应用程序的数据库供应商名称:数据库供应商 | 后端标识 | 描述 |
---|---|---|
DB2® | DB2UDB_V81 | DB2 通用数据库 Linux® 版、UNIX® 版和 Windows® 版 V8.1 |
DB2UDB_V82 | DB2 通用数据库 Linux 版、UNIX 版和 Windows 版 V8.2 | |
DB2UDBOS390_V7 | DB2 通用数据库™ z/OS® 版 V7 | |
DB2UDBOS390_V8 | DB2 通用数据库 z/OS 版 V8 | |
DB2UDBOS390_NEWFN_V8 | DB2 通用数据库 z/OS 版 V8 除了 DB2UDBOS390_V8 选项之外,此选项包括以新功能方式指定了 DB2 通用数据库 z/OS 版 V8 的所有新目录功能的已生成数据模型。如果计划使用 WebSphere® Application Server Toolkit 或 IBM® Rational®Software Development Platform 产品中提供的已生成数据模型,则使用此选项。 | |
DB2UDBISERIES_V53 | DB2 通用数据库 iSeries™ 版 V5R3 | |
DB2UDBISERIES_V54 | DB2 通用数据库 iSeries 版 V5R4 | |
Oracle | ORACLE_V9I | Oracle V9i |
ORACLE_V10G | Oracle V10g | |
Informix® | INFORMIX_V93 | Informix Dynamic Server V9.3 |
INFORMIX_V94 | Informix Dynamic Server V9.4 | |
INFORMIX_V100 | Informix Dynamic Server V10.0 | |
Sybase | SYBASE_V1250 | Sybase Adaptive Server Enterprise V12.5 |
SYBASE_V15 | Sybase Adaptive Server Enterprise V15.0 | |
SQL Server | MSSQLSERVER_2000 | Microsoft® SQL Server 2000 |
MSSQLSERVER_2005 | Microsoft SQL Server 2005 | |
Cloudscape™ | DERBY_V10 | IBM Cloudscape V10.1 |
- SQL92(1992 SQL 标准)
- SQL99(1999 SQL 标准)
使用 SQL 语句指定列名
使用 SQL 指定列名的语法与数据库有关。对于 DB2 和 Oracle,列、表和相关名将用双引号括起来使区分大小写的名称保留原样。以下是 DB2 的已转换 SQL 语句示例:
SELECT q1."EMPID", q1."NAME",q1."SALARY" FROM Emp q1
但是,Informix、SQL Server 和 Sybase 不用双引号将列名引起来。以下是 Sybase 的已转换 SQL 语句示例:
SELECT q1.EMPID, q1.NAME, q1.SALARY FROM Emp q1
数据库函数
以下各节列示了在 EJB 查询中可以使用的数据库函数并显示了指定数据库供应商后端的已转换 SQL 语法:标量函数
EJB 查询包含进行类型转换、字符串处理和用于处理日期时间值的标量函数。有关标量函数列表的更多信息,请参阅主题EJB 查询:标量函数。
表左边的列列示了 EJB 查询可能包含的标量函数。EJB 查询函数列的右边列示了下推至每个列的标题中列示的各个后端数据库供应商的 SQL 语法。不包含文本的空单元格表示 EJB 查询函数不能下推至特定后端数据库供应商,因此会产生Cannot push down query 错误情况。
EJB 查询函数 | DB2 z/OS | DB2 | Oracle | Informix | Sybase | SQL Server | SQL92/SQL99 | Cloudscape |
---|---|---|---|---|---|---|---|---|
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 | 时间 | 时间 | 时间 | |||||
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 |
日期时间运算和比较
有关日期时间运算和比较的一般知识,请参阅 WebSphere 信息中心中的日期时间运算和比较主题。
DB2 系列支持对 DATE、TIME 和 TIMESTAMP 值使用字符串表示法,并支持使用 EJB 查询语言指定运算和比较操作。有关 DB2 中 DATE、TIME 和 TIMESTAMP 值的详细信息,请参阅日期时间值主题。
对于除 DB2 系列之外的数据库,不支持对 DATE、TIME 和 TIMESTAMP 值使用字符串表示法,也不支持使用 EJB 查询语言指定运算和比较操作。可以通过使用 Java™ long 数据类型表示日期、时间或时间戳记值(以毫秒计)。日期、时间或时间戳记文字应该是数字文字。要生成毫秒值,可以使用 java.util.Calendar 类。使用 java.util.Calendar 接口来比较不同的日历对象。
示例后端数据库供应商 | 样本 EJB 查询语句 | 已转换的 SQL 查询语句 |
---|---|---|
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' |
CONCAT、LOCATE、LENGTH 和 SUBSTR 函数
并置运算符(CONCAT)链接两个字符串操作数以组成一个字符串表达式。并置的操作数必须是兼容字符串。定位运算符返回搜索字符串第一次出现在源字符串中的起始位置。长度运算符返回值的长度。子串运算符(SUBSTR)返回字符串的子串。
DB2 与其他数据库供应商
对于 DB2,接受输入自变量作为输入参数的函数(如 SUBSTR、CONCAT、LOCATE 和 LENGTH 函数)要求使用 CAST 语法,但其他数据库供应商不需要对其函数执行强制转型。
示例:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith' {_varchar}以下是 z/OS 上的 DB2 通用数据库 的已转换 SQL 语句:
SELECT q1."EMPID", q1."NAME" FROM Emp q1 WHERE (CAST(SUBSTR ( ?, 1) AS VARCHAR(255)) = 'John Smith')以下是 Informix 的已转换 SQL 语句:
SELECT q1.EMPID, q1.NAME FROM Emp q1 WHERE SUBSTR(?,1)='John Smith'您可以看到其他数据库供应商(在本示例中,Informix)对于 SUBSTR 函数不要求使用 CAST 语法。
DB2 通用数据库 iSeries 版、Windows 和 UNIX 版
对于 DB2 通用数据库 iSeries 版、Windows 和 UNIX 版,CONCAT 函数会将合并的长度属性强制转型为 4000 或 32672,如下所示。请参阅 DB2 信息中心以了解详细信息。
示例:
示例 #1:将组合的长度属性强制转型为 VARCHAR(4000)
SELECT e FROM EmpBean e WHERE concat(?1, 'ahmad') = 'deptahmad' {_varchar}已转换的 SQL 语句:
SELECT q2."no", q2."name" FROM userid.Emp q1 WHERE (CAST(concat ( ?, 'ahmad') AS VARCHAR(4000)) = 'deptahmad')示例 #2:使用数据类型为 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 通用数据库 z/OS 版
如果存在参数标记,则接受输入自变量作为输入参数的函数(如 CONCAT、SUBSTR、LOCATE 和 LENGTH 函数)要求按 DB2 参考手册中的定义对参数标记的长度属性进行强制转型。有关详细信息,请参阅下列主题:- SUBSTR 标量函数
- 请参阅 表达式主题中的带有并置运算符的表达式 一节
- LOCATE 标量函数
- LENGTH 标量函数
示例:
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
SQLJ 使您能够将 SQL 语句嵌入到 Java™ 程序中。
SQLJ 支持可供所有 DB2 系列后端使用,但 DB2 iSeries 版除外。
有关 SQLJ 的更多详细信息,请参阅使用 Java 结构化查询语言(SQLJ)支持主题。
乐观谓词子句
UPDATE SET X = ? WHERE ID = ? AND X = ?
其中 ID 是主键列。
对于 DB2UDBOS390_V8 后端标识,如果乐观谓词列可空,则生成的 UPDATE 查询将使用“IS NOT DISTINCT FROM”构造。例如,如果 ID 为主键列并且 NAME 可空,则生成的 UPDATE 查询为:
UPDATE SET NAME = ? WHERE ID = ? AND NAME IS NOT DISTINCT FROM ?
使用 SELECT 语句获得更新锁定的语法依赖于数据库。有关 UPDATE 子句的已转换 SQL 语句的详细信息,请参阅访问意向 - 隔离级别和更新锁定主题。
反馈