SQL 的 EJB 查询语法

SQL 的 EJB 查询语法

使用 SQL 执行 EJB 查询的语法与数据库有关。将此信息用作参考,以从在不同数据库供应商后端运行 EJB 查询来发现已转换的 SQL 语句。
此参考主题对执行下列任务的人员很有用:
  • 选择针对不受支持的数据库进行部署。使用此参考主题帮助选择与不受支持的部署环境紧密匹配的有效数据库供应商后端标识。
  • 选择使用不推荐使用的 SQL92 或 SQL99 后端标识。使用此参考主题帮助确定在不久的将来,当不推荐使用的 SQL92 和 SQL99 后端不再可用时,应该使用什么后端。

受支持的数据库供应商后端标识

以下是受支持的数据库供应商名称列表,您可以指定要部署应用程序的数据库供应商名称:
注: 运行 ejbdeploy 命令时,将后端标识用作  dbvendor 参数的值。有关 ejbdeploy 命令的更多信息,请参阅 ejbdeploy 命令主题。
表 1. 受支持的数据库供应商后端标识
数据库供应商后端标识描述
DB2®DB2UDB_V81DB2 通用数据库 Linux® 版、UNIX® 版和 Windows® 版 V8.1
DB2UDB_V82DB2 通用数据库 Linux 版、UNIX 版和 Windows 版 V8.2
DB2UDBOS390_V7DB2 通用数据库™ z/OS® 版 V7
DB2UDBOS390_V8DB2 通用数据库 z/OS 版 V8
DB2UDBOS390_NEWFN_V8DB2 通用数据库 z/OS 版 V8

除了 DB2UDBOS390_V8 选项之外,此选项包括以新功能方式指定了 DB2 通用数据库 z/OS 版 V8 的所有新目录功能的已生成数据模型。如果计划使用 WebSphere® Application Server Toolkit 或 IBM® Rational®Software Development Platform 产品中提供的已生成数据模型,则使用此选项。

DB2UDBISERIES_V53DB2 通用数据库 iSeries™ 版 V5R3
DB2UDBISERIES_V54DB2 通用数据库 iSeries 版 V5R4
OracleORACLE_V9IOracle V9i
ORACLE_V10GOracle V10g
Informix®INFORMIX_V93Informix Dynamic Server V9.3
INFORMIX_V94Informix Dynamic Server V9.4
INFORMIX_V100Informix Dynamic Server V10.0
SybaseSYBASE_V1250Sybase Adaptive Server Enterprise V12.5
SYBASE_V15Sybase Adaptive Server Enterprise V15.0
SQL ServerMSSQLSERVER_2000Microsoft® SQL Server 2000
MSSQLSERVER_2005Microsoft SQL Server 2005
Cloudscape™DERBY_V10IBM Cloudscape V10.1
不推荐使用下列后端标识:
  • SQL92(1992 SQL 标准)
  • SQL99(1999 SQL 标准)
尽管不推荐使用 SQL92 和 SQL99,但 SQL92 和 SQL99 选项仍然可用。

使用 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 错误情况。

表 2. EJB 查询中的标量函数以及什么是下推至每个后端的 SQL 语法
EJB 查询函数DB2 z/OSDB2OracleInformixSybaseSQL ServerSQL92/SQL99Cloudscape
ABSabsabsabsabsabsabsabsabs
SQRTsqrtsqrtsqrtsqrtsqrtsqrtsqrtsqrt
CONCATconcatconcatconcat||++||concat
LENGTHlengthlengthlengthlengthchar_lengthlenchar_lengthlength
LOCATElocatelocateinstrlocatecharindexcharindexlocatelocate
SUBSTRINGsubstrsubstrsubstrsubstrsubstringsubstringsubstrsubstr
MODmodmodmodmodmod%modmod
ucaseupperupperupperupperupperupperupperupper
upperupperupperupperupperupperupperupperupper
lcaselowerlowerlowerlowerlowerlowerlowerlower
lowerlowerlowerlowerlowerlowerlowerlowerlower
charcharcharto_char charchar char
bigint bigint     bigint
datedatedate     date
decimaldecimaldecimal      
double double     double
floatfloatfloat     float
integerintegerinteger     integer
realrealreal     real
smallint smallint     smallint
time时间时间     时间
timestamptimestamptimestamp     timestamp
digitsdigitsdigits     digits
daydayday     day
daysdaysdays     days
hourhourhour     hour
microsecondmicrosecondmicrosecond     microsecond
minuteminuteminute     minute
monthmonthmonth     month
secondsecondsecond     second
yearyearyear     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 查询的示例。
注:  emp_ts 的数据类型为  Calendar
表 3. 日期、时间和时间戳记表示法:不同数据库供应商的 EJB 查询示例及其下推 SQL 语句:
后端数据库供应商样本 EJB 查询语句已转换的 SQL 查询语句
DB2SELECT e FROM EmpBean e WHERE e.emp_ts=71039082SELECT q1."no", q1."name", q1."emp_ts" FROM userid.iEmp q1 WHERE q1."emp_ts" = '1970-1-1-11.43.59.082'
OracleSELECT e FROM EmpBean e WHERE e.emp_ts=71039082SELECT 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')
InformixSELECT e FROM EmpBean e WHERE e.emp_ts>71039082SELECT 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)
CloudscapeSELECT e FROM EmpBean e WHERE e.emp_ts<71039082SELECT q1."no", q1."name", q1."emp_ts" FROM userid.iEmp q1 WHERE q1."emp_ts" < '1970-1-1-11.43.59.082'
SQL ServerSELECT e FROM EmpBean e WHERE e.emp_ts=71039082SELECT q1.no, q1.name, q1.emp_ts FROM userid.iEmp q1 WHERE q1.emp_ts = 'Jan 1 1970 11:43:59.82 AM'
SybaseSELECT e FROM EmpBean e WHERE e.emp_ts=71039082SELECT 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 语法,但其他数据库供应商不需要对其函数执行强制转型。

示例:

考虑以下样本 EJB 查询语句,其输入自变量的输入参数类型为  java.lang.String
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)

样本 EJB 查询语句:
 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 参考手册中的定义对参数标记的长度属性进行强制转型。有关详细信息,请参阅下列主题:

示例:

样本 EJB 查询语句:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith'  {_varchar}
已转换的 SQL 语句:
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 SQL 语句的 WHERE 子句中:
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 语句的详细信息,请参阅访问意向 - 隔离级别和更新锁定主题。


反馈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值