SQL で EJB 照会を実行するための構文は、データベースによって異なります。ここに記載する情報は、他のデータベース・ベンダー・バックエンドに対して 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™ for z/OS® および OS/390® V7 | |
DB2UDBOS390_V8 | DB2 Universal Database for z/OS および OS/390 V8 | |
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 |
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 用の構文は、SQL92 に準拠していません。次のように、SQL ステートメントの WHERE 文節で Oracle の「+」構文が使用されます。
SELECT ... FROM t1, t2 WHERE t1.col1=t2.col2 (+)
EJB 照会には、型変換とストリング処理を実行するためのスカラー関数、および日付/時刻値を取り扱うためのスカラー関数が含まれています。スカラー関数のリストについての詳細は、トピック『EJB 照会: スカラー関数』を参照してください。
表の左側の列には、EJB 照会に含まれる可能性のあるスカラー関数がリストされています。EJB 照会関数の列の右側には、各列の見出しにリストされた各バックエンド・データベース・ベンダー用にプッシュダウンされる SQL 構文が記載されています。テキストのない空のセルは、そのバックエンド・データベース・ベンダーには EJB 照会関数をプッシュダウンすることができず、結果として、Cannot push down query エラー状態が発生することを示しています。
EJB 照会関数 | DB2 OS390 | DB2 | Oracle | Informix | Sybase | SQL Server | Cloudscape |
---|---|---|---|---|---|---|---|
ABS | abs | abs | abs | abs | abs | abs | abs |
SQRT | sqrt | sqrt | sqrt | sqrt | sqrt | sqrt | sqrt |
CONCAT | concat | concat | concat | || | + | + | || |
LENGTH | length | length | length | length | char_length | len | char_length |
LOCATE | locate | locate | instr | locate | charindex | charindex | locate |
SUBSTRING | substr | substr | substr | substr | substring | substring | substr |
MOD | mod | mod | mod | mod | mod | % | mod |
ucase | 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 |
char | char | char | to_char | char | char | ||
bigint | bigint | ||||||
date | date | date | |||||
decimal | decimal | decimal | |||||
double | double | ||||||
float | float | float | |||||
integer | integer | integer | |||||
real | real | real | |||||
smallint | smallint | ||||||
time | time | time | |||||
timestamp | timestamp | timestamp | |||||
digits | digits | digits | |||||
day | day | day | |||||
days | days | days | |||||
hour | hour | hour | |||||
microsecond | microsecond | microsecond | |||||
minute | minute | minute | |||||
month | month | month | |||||
second | second | second | |||||
year | year | year |
日付/時刻の算術および比較に関する一般的な知識については、WebSphere InfoCenter でトピック『日時の演算および比較』を参照してください。
DB2 ファミリーにおける DATE 値、TIME 値、ならびに TIMESTAMP 値のストリング表記の使用方法、および EJB 照会言語における算術演算と比較演算の指定方法に関するサポート情報を確認することができます。DB2 における DATE、 TIME、および TIMESTAMP 値についての詳細は、トピック『日付/時刻の値』を参照してください。
DB2 ファミリー以外のデータベースでは、DATE、TIME、および TIMESTAMP 値でのストリング表記の使用、および EJB 照会言語での算術演算と比較演算の指定はサポートされていません。その代わりに、Java の long データ型を使用して、ミリ秒単位で日時またはタイム・スタンプの値を表記することができます。日時またはタイム・スタンプのリテラルは、数値リテラルである必要があります。ミリ秒値を生成するには、java.util.Calendar クラスを使用します。 別の Calendar オブジェクトとの比較には、java.util.Calendar インターフェースを使用します。
例以下の表は、各データベース・ベンダーごとに、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" = '2001-11-12-12.45.55.000123' |
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) は、2 つのストリング・オペランドをリンクして、単一のストリング式を形成します。連結に使用する各オペランドは、互換性のあるストリングでなければなりません。サブストリング 演算子 (SUBSTR) は、ストリングのサブストリングを戻します。
DB2 と他のデータベース・ベンダーの違い
DB2 の SUBSTR 関数および CONCAT 関数では CAST 構文を使用する必要がありますが、他のデータベース・ベンダーでは、SUBSTR 関数および CONCAT 関数に CAST 構文を使用する必要はありません。
例:
SELECT e FROM EmpBean e WHERE SUBSTRING(e.name, 1) = 'John Smith'z/OS または OS/390 用 の DB2 Universal Database 向けに変換された SQL ステートメントは、次のようになります。
SELECT q1."EMPID", q1."NAME" FROM Emp q1 WHERE (CAST(SUBSTR ( q1."NAME", 1) AS VARCHAR(255)) = 'John Smith')Informix 向けに変換された SQL ステートメントは、次のようになります。
SELECT q1.EMPID, q1.NAME FROM Emp q1 WHERE SUBSTR(q1.NAME,1)='John Smith'他のデータベース・ベンダー (この例では Informix) では SUBSTR 関数に CAST 構文が必要ないことが分かります。
DB2 for iSeries と Universal Database for Windows および UNIX
DB2 for iSeries と、Universal Database for Windows および UNIX の場合、 CONCAT 関数は結合された長さ属性を 4000 に CAST し、結果のデータ型を強制的に VARCHAR にします。データ型 CHAR または VARCHAR のパラメーター・マーカーがある場合、CONCAT 関数はパラメーター・マーカーの長さ属性を 32672 に CAST します。
例
例 1: 結合された長さ属性を VARCHAR(4000) に CAST する
SELECT e FROM EmpBean e WHERE concat(e.name, 'ahmad') = 'deptahmad'変換された SQL ステートメント:
SELECT q2."no", q2."name" FROM userid.Emp q1 WHERE (CAST(concat ( q1."name", 'ahmad') AS VARCHAR(4000)) = 'deptahmad')
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
SELECT e FROM EmpBean e WHERE SUBSTRING(e.name, 1) = 'John Smith'変換された SQL ステートメント:
SELECT q1."EMPID", q1."NAME" FROM Emp q1 WHERE (CAST(SUBSTR ( q1."NAME", 1) AS VARCHAR(255)) = 'John Smith')
SQLJ を使用すると、Java™ プログラムに SQL ステートメントを組み込むことができます。
SQLJ サポートは、DB2 ファミリーのバックエンドでのみ使用可能です。
SQLJ についての詳細は、トピック『Introduction to SQLJ』を参照してください。
UPDATE SET X=? WHERE X = ?
SELECT ステートメントを使用して更新ロックを取得するための構文は、データベースによって異なります。以下の表は、各データベース・ベンダー・バックエンド向けに変換された SQL ステートメントをまとめたものです。
データベース・バックエンド | 変換された SQL ステートメント |
---|---|
DB2UDB_V81 | SELECT ... FOR UPDATE OF column_name |
DB2UDB_V82 | SELECT ... FOR READ ONLY WITH RS USE AND KEEP UPDATE LOCKS |
DB2UDBOS390_V7 | SELECT ... FOR UPDATE OF column_name WITH RS KEEP UPDATE LOCKS |
DB2UDBOS390_V8 | SELECT ... FOR READ ONLY WITH RS USE AND KEEP UPDATE LOCKS |
DB2UDBISERIES | SELECT ....FOR UPDATE OF column_name |
DB2UDBISERIES_V52 | SELECT ....FOR UPDATE OF column_name |
DB2UDBISERIES_V53 | SELECT ....FOR READ ONLY WITH RS USE AND KEEP EXCLUSIVE LOCKS |
Oracle | SELECT ..FOR UPDATE |
Informix | SELECT ..FOR UPDATE |
Sybase | SELECT ..FOR UPDATE |
SQL Server | SELECT .. FROM TABLE t1 (UPDLOCK) |
Cloudscape | SELECT ..FOR UPDATE OF column_name |