執行 EJB 查詢的 SQL 語法是和資料庫相關的。您可以把本文件當做參考資料, 探索不同資料庫供應商後端系統上執行 EJB 查詢的轉換 SQL 陳述式。
資料庫供應商 | 後端系統 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 |
指定直欄名稱的 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
執行外部結合的 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 查詢函數不可推入至該特定後端資料庫供應商, 因而產生無法推入查詢的錯誤狀況。
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 查詢陳述式 |
---|---|---|
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 運算子會傳回搜尋字串在來源字串中第一次出現的起始位置。長度 運算子傳回值的長度。子字串 運算子 (SUBSTR) 會傳回字串的子字串。
DB2 和其他資料庫供應商的比較
對於 DB2, 接受輸入引數當做輸入參數的函數(例如 SUBSTR、CONCAT、LOCATE 及 LENGTH 函數)必須使用 CAST 語法,但其他資料庫供應商的函數不需要 CAST。
範例:
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)
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 函數),就需要將參數記號的長度屬性強制轉型。 如需詳細資料,請參閱下列主題:範例:
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 可讓您將 SQL 陳述式內嵌至 Java™ 程式中。
所有 DB2 系列後端系統都支援 SQLJ, 但 DB2 for iSeries 除外。
如需 SQLJ 的詳細資料,請參閱 SQLJ 簡介主題。
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 陳述式詳細資料,請參閱 存取目的 -- 隔離層次及更新鎖定主題。