SQL で EJB 照会を実行するための構文は、データベースによって異なります。ここに記載する情報は、他のデータベース・ベンダー・バックエンドに対して EJB 照会を実行する場合に、変換された SQL ステートメントがどのようなものになるかを確認する際の参照情報として使用してください。
データベース・ベンダー | バックエンド ID | 説明 |
---|---|---|
DB2R | DB2UDB_V81 | DB2 Universal Database V8.1 for WindowsR および UNIXR |
DB2UDB_V82 | DB2 Universal Database V8.2 for Windows および UNIX | |
DB2UDBOS390_V7 | DB2 Universal Database? for z/OSR および OS/390R 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 | |
InformixR | 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 | MicrosoftR 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 サーバー、および 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 照会関数をプッシュダウンすることができず、結果として、Cannot push down query エラー状態が発生することを示しています。
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 |
日付/時刻の算術および比較に関する一般的な知識については、 WebSphereR 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 照会ステートメント |
---|---|---|
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) は、2 つのストリング・オペランドをリンクして、単一のストリング式を形成します。連結に使用する各オペランドは、互換性のあるストリングでなければなりません。検索 演算子 (LOCATE) は、 ソース・ストリング内で最初に検出された検索ストリングの開始位置を戻します。 長さ 演算子 (LENGTH) は、値の長さを戻します。 サブストリング 演算子 (SUBSTR) は、ストリングのサブストリングを戻します。
DB2 と他のデータベース・ベンダーの違い
DB2 では、 入力引数を SUBSTR、CONCAT、LOCATE、LENGTH 関数などの入力パラメーターとして受け入れる関数で CAST 構文を使用する必要がありますが、他のデータベース・ベンダーでは、これらの関数で CAST を使用する必要はありません。
例:
SELECT e FROM EmpBean e WHERE SUBSTRING(?1, 1) = 'John Smith' {_varchar}z/OS または OS/390 用 の DB2 Universal Database 向けに変換された 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 関数は結合された長さ属性を 4000 または 32672 に CAST します。詳しくは、「DB2 インフォメーション・センター」を参照してください。
例
例 1: 結合された長さ属性を VARCHAR(4000) に CAST する
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
パラメーター・マーカーがある場合、入力引数を CONCAT、SUBSTR、LOCATE、LENGTH 関数などの入力パラメーターとして受け入れる関数は、 DB2 のリファレンス・マニュアルに記載されているように、 パラメーター・マーカーの長さ属性を CAST する必要があります。詳しくは、以下のトピックを参照してください。例:
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 を使用すると、Java? プログラムに SQL ステートメントを組み込むことができます。
SQLJ サポートは、DB2 for iSeries を除く すべての DB2 ファミリー・バックエンドで使用できます。
SQLJ についての詳細は、トピック Introduction to SQLJ を参照してください。
UPDATE SET X = ? WHERE ID = ? AND X = ?
ここで、ID は基本キー列です。
DB2UDBOS390_V8 バックエンド ID でオプティミスティック述部列がヌル可能になっている場合、生成される UPDATE 照会に「IS NOT DISTINCT FROM」構文が使用されます。例えば、ID が基本キー列で、NAME がヌル可能になっている場合、生成される UPDATE 照会は次のようになります。
UPDATE SET NAME = ? WHERE ID = ? AND NAME IS NOT DISTINCT FROM ?
SELECT ステートメントを使用して更新ロックを取得するための構文は、データベースによって異なります。UPDATE 文節の変換済み SQL ステートメントについて詳しくは、 アクセス・インテント -- 分離レベルおよび更新ロックを参照してください。