EJB 照会から SQL 構文への変換

SQL で EJB 照会を実行するための構文は、データベースによって異なります。ここに記載する情報は、他のデータベース・ベンダー・バックエンドに対して EJB 照会を実行する場合に、変換された SQL ステートメントがどのようなものになるかを確認する際の参照情報として使用してください。

この参考トピックは、以下のようなユーザーを対象としています。
  • 非サポートのデータベースに対してデプロイを実行するユーザー。この参照トピックを利用して、ご使用の非サポート・デプロイメント環境に適した有効なデータベース・ベンダー・バックエンド ID を選択してください。
  • 使用すべきではない SQL92 または SQL99 バックエンド ID を使用するユーザー。近い将来、使用すべきではない SQL92 および SQL99 バックエンドが使用できなくなった場合に、この参照トピックを利用して、使用すべきバックエンドを決定してください。

サポートされるデータベース・ベンダー・バックエンド ID

アプリケーションのデプロイ先として指定可能な、サポートされるデータベース・ベンダー名のリストを以下に示します。
注: ejbdeploy コマンドの実行時に dbvendor 引数の値としてバックエンド ID を使用してください。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™ 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
以下のバックエンド ID は使用すべきではありません。
  • SQL92 (1992 SQL 標準)
  • SQL99 (1999 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 を除く) が、米国規格協会 (ANSI) 準拠の外部結合構文を使用しています。以下に、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 エラー状態が発生することを示しています。

表 2. EJB 照会におけるスカラー関数と各バックエンドにプッシュダウンされる SQL 構文
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 照会をリストしたものです。

表 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" = '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 関数および SUBSTR 関数

連結 演算子 (CONCAT) は、2 つのストリング・オペランドをリンクして、単一のストリング式を形成します。連結に使用する各オペランドは、互換性のあるストリングでなければなりません。サブストリング 演算子 (SUBSTR) は、ストリングのサブストリングを戻します。

DB2 と他のデータベース・ベンダーの違い

DB2 の SUBSTR 関数および CONCAT 関数では CAST 構文を使用する必要がありますが、他のデータベース・ベンダーでは、SUBSTR 関数および CONCAT 関数に CAST 構文を使用する必要はありません。

例:

例えば、次のような EJB 照会ステートメントがあるとします。
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 する

サンプル EJB 照会ステートメント:
 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')  
例 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 Universal Database for z/OS および OS/390 の場合、CONCAT 関数および SUBSTR 関数は DB2 のリファレンス・マニュアルに定義されたとおりに、結合された長さ属性を CAST します。パラメーター・マーカーがある場合、CONCAT 関数および SUBSTR 関数は、パラメーター・マーカーの長さ属性についても、DB2 のリファレンス・マニュアルに規定されたとおりに CAST します。詳しくは、以下のトピックを参照してください。 例:
サンプル EJB 照会ステートメント:
 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

SQLJ を使用すると、Java™ プログラムに SQL ステートメントを組み込むことができます。

SQLJ サポートは、DB2 ファミリーのバックエンドでのみ使用可能です。

SQLJ についての詳細は、トピック『Introduction to SQLJ』を参照してください。

オプティミスティック述部文節

オプティミスティック並行性制御は、ある特定のリソースが他のトランザクションで利用できなくなる時間を最小化することを目的としています。オプティミスティック・アクセス・インテントをセットアップする際は、オプティミスティック述部に組み込む属性を指定する必要があります。属性は、以下のように、UPDATE SQL ステートメントの WHERE 分節で指定します。
UPDATE SET X=? WHERE X = ?

SELECT ステートメントを使用して更新ロックを取得するための構文は、データベースによって異なります。以下の表は、各データベース・ベンダー・バックエンド向けに変換された SQL ステートメントをまとめたものです。

表 4. UPDATE 文節用の変換された 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
ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.
(C) Copyright IBM Japan 2005.