SQL 語法的 EJB 查詢

執行 EJB 查詢的 SQL 語法是和資料庫相關的。您可以把本文件當做參考資料, 探索不同資料庫供應商後端系統上執行 EJB 查詢的轉換 SQL 陳述式。

這個參考主題也許有助於選擇下列方式的使用者:
  • 選擇對不受支援的資料庫進行部署。使用本參考主題, 有助於選擇與不受支援的部署環境最符合的有效資料庫供應商後端系統 ID。
  • 選擇使用即將棄用的 SQL92 或 SQL99 後端系統 ID。使用本參考主題, 有助於您判斷在不久的將來即將棄用的 SQL92 及 SQL99 後端系統無法使用時, 應該使用的後端系統。

支援的資料庫供應商後端系統 ID

下列清單是支援的資料庫供應商名稱, 您可以指定這些名稱部署應用程式:
註: 執行 ejbdeploy 指令時, 將後端系統 ID 當做 dbvendor 引數的值使用。如需 ejbdeploy 指令的相關資訊, 請參閱 ejbdeploy 指令主題。
表 1. 支援的資料庫供應商後端系統 ID
資料庫供應商 後端系統 ID 說明
DB2® DB2UDB_V81 DB2 Universal Database V8.1 for Windows® 和 UNIX®
DB2UDB_V82 DB2 Universal Database V8.2 for Windows 和 UNIX
DB2UDBOS390_V7 DB2 Universal Database V7™ for z/OS® 和 OS/390®
DB2UDBOS390_V8 DB2 Universal Database V8™ for z/OS 和 OS/390
DB2UDBISERIES DB2 for iSeries™
DB2UDBISERIES_V52 DB2 for iSeries, V5R2
DB2UDBISERIES_V53 DB2 for 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
下列後端系統 ID 即將棄用:
  • SQL92 (1992 SQL Standard)
  • SQL99 (1999 SQL Standard)
雖然 SQL92 及 SQL99 即將棄用,但您還是可以使用 SQL92 及 SQL99 選項。如果使用 SQL92 或 SQL92 選項, 則會產生 Cloudscape V5 的 SQL。

以 SQL 陳述式指定直欄名稱

指定直欄名稱的 SQL 語法是和資料庫相關的。對於 DB2、Oracle 和 Cloudscape,直欄、表格和相互關係名稱皆以雙引號括住,以保留有大小寫區分的名稱。下列是 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 語法:

外部結合

執行外部結合的 SQL 語法是和資料庫相關的。

就外部結合語法來說, 所有支援的資料庫供應商 (除了 Oracle V8) 都符合美國國家標準局 (ANSI) 標準。下列是執行外部結合的 SQL 陳述式語法:
SELECT ...  FROM t1 LEFT OUTER JOIN t2 ON (t1.col1=t2.col2)
對於 Oracle,在 SQL 陳述式的 WHERE 子句中,必須使用 "+" 語法:
SELECT ... FROM t1, t2 WHERE t1.col1=t2.col2 (+)

純量函數

EJB 查詢含有純量函數,可以轉換類型、操作字串以及操作日期-時間值。如需純量函數清單的相關資訊,請參閱EJB 查詢:純量函數主題。

下表的左欄列出 EJB 查詢可能包含的純量函數。在 EJB 查詢函數直欄右邊, 分別列出推入至各後端資料庫供應商 (名稱列於各直欄標題) 的 SQL 語法。 不包含文字的空資料格,表示 EJB 查詢函數不可推入至該特定後端資料庫供應商, 因而產生無法推入查詢的錯誤狀況。

表 2. EJB 查詢中的純量函數,以及推入至各後端系統的 SQL 語法
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

日期時間運算及比較

如需日期、時間運算及比較的一般知識, 請參閱 WebSphere® InfoCenter 的日期時間運算及比較主題。

支援 DB2 系列在 DATE、TIME 及 TIMESTAMP 值上使用字串表示法;並且以 EJB 查詢語言指定運算及比較作業。如需 DB2 中 DATE、TIME 及 TIMESTAMP 值的詳細資料, 請參閱日期時間值主題。

對於 DB2 系列以外的資料庫, 不支援在 DATE、TIME 及 TIMESTAMP 值上使用字串表示法; 並且以 EJB 查詢語言指定運算及比較作業。您可以改用 Java™ long 資料類型, 以毫秒代表日期、時間或時間戳記值。日期、時間或時間戳記文字應該是數值文字。若要產生毫秒值, 您可以使用 java.util.Calendar 類別。使用 java.util.Calendar 介面比較不同的 Calendar 物件。

範例
下表針對每一個資料庫供應商,各列了一個 EJB 查詢範例及其轉換後的 SQL 查詢。
註: emp_ts 的資料類型是 Calendar
表 3. 日期、時間及時間戳記表示法:不同資料庫供應商的 EJB 查詢範例及其推入 SQL 陳述式。
後端資料庫供應商 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) 鏈結兩個字串運算元,形成字串表示式。連結運算元必須是相容字串。locate 運算子會傳回搜尋字串在來源字串中第一次出現的起始位置。長度 運算子傳回值的長度。子字串 運算子 (SUBSTR) 會傳回字串的子字串。

DB2 和其他資料庫供應商的比較

對於 DB2, 接受輸入引數當做輸入參數的函數(例如 SUBSTR、CONCAT、LOCATE 及 LENGTH 函數)必須使用 CAST 語法,但其他資料庫供應商的函數不需要 CAST。

範例:

請考量下列 EJB 查詢陳述式範例, 其輸入引數有 java.lang.String 類型的輸入參數:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith'  {_varchar}
下列是 DB2 Universal Database™ for z/OS 或 OS/390 的轉換 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 for iSeries 以及 Universal Database for Windows 和 UNIX

對於 DB2 for iSeries 以及 Universal Database for Windows 和 UNIX, CONCAT 函數將結合的長度屬性 CAST 為 4000 或 32672, 如下所示。如需詳細資料,請參閱 DB2 資訊中心

範例:

範例 #1:將組合的長度屬性強制轉型 (CAST) 為 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 Universal Database™ for z/OS 和 OS/390

根據 DB2 參考手冊的定義,如果有參數記號,則接受輸入引數作為輸入參數的函數(例如,CONCAT、SUBSTR、LOCATE、LENGTH 函數),就需要將參數記號的長度屬性強制轉型。 如需詳細資料,請參閱下列主題:

範例:

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™ 程式中。

所有 DB2 系列後端系統都支援 SQLJ, 但 DB2 for iSeries 除外。

如需 SQLJ 的詳細資料,請參閱 SQLJ 簡介主題。

樂觀述語子句

樂觀並行控制的目標是儘量縮短特定資源無法使用於其他交易的時間。設定樂觀存取目的時, 您必須指定要併入樂觀述語中的屬性。屬性會併入到 UPDATE SQL 陳述式的 WHERE 子句:
UPDATE SET X = ? WHERE ID = ? AND X = ?

,其中 ID 是主鍵直欄。

對於 DB2UDBOS390_V8 後端系統 ID, 如果樂觀述語直欄可為 NULL,則得出的 UPDATE 查詢會採用 "IS NOT DISTINCT FROM" 架構。比方說,如果 ID 是主鍵直欄,而 NAME 可為 NULL,則得出的 UPDATE 查詢為:

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

利用 SELECT 陳述式取得更新鎖定的語法是和資料庫相關的。如需 UPDATE 子句的轉換 SQL 陳述式詳細資料,請參閱 存取目的 -- 隔離層次及更新鎖定主題。

使用條款 | 讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.