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

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

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

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

アプリケーションのデプロイ先として指定可能な、サポートされるデータベース・ベンダー名のリストを以下に示します。
注: ejbdeploy コマンドの実行時に dbvendor 引数の値としてバックエンド ID を使用してください。ejbdeploy コマンドについての詳細は、ejbdeploy コマンドトピックを参照してください。
表 1. サポートされるデータベース・ベンダー・バックエンド ID
データベース・ベンダー バックエンド 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
以下のバックエンド ID は使用すべきではありません。
  • SQL92 (1992 SQL 標準)
  • SQL99 (1999 SQL 標準)
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 サーバー、および 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 照会関数をプッシュダウンすることができず、結果として、Cannot push down query エラー状態が発生することを示しています。

表 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

日時の演算および比較

日付/時刻の算術および比較に関する一般的な知識については、 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 照会の例をリストしたものです。
注: 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) は、2 つのストリング・オペランドをリンクして、単一のストリング式を形成します。連結に使用する各オペランドは、互換性のあるストリングでなければなりません。検索 演算子 (LOCATE) は、 ソース・ストリング内で最初に検出された検索ストリングの開始位置を戻します。 長さ 演算子 (LENGTH) は、値の長さを戻します。 サブストリング 演算子 (SUBSTR) は、ストリングのサブストリングを戻します。

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

DB2 では、 入力引数を SUBSTR、CONCAT、LOCATE、LENGTH 関数などの入力パラメーターとして受け入れる関数で CAST 構文を使用する必要がありますが、他のデータベース・ベンダーでは、これらの関数で CAST を使用する必要はありません。

例:

java.lang.String 型の入力パラメーターを持つ入力引数が指定された、 次のサンプル EJB 照会ステートメントの場合を考えてみます。
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 する

サンプル 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

パラメーター・マーカーがある場合、入力引数を CONCAT、SUBSTR、LOCATE、LENGTH 関数などの入力パラメーターとして受け入れる関数は、 DB2 のリファレンス・マニュアルに記載されているように、 パラメーター・マーカーの長さ属性を CAST する必要があります。詳しくは、以下のトピックを参照してください。

例:

サンプル 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 を使用すると、Java? プログラムに SQL ステートメントを組み込むことができます。

SQLJ サポートは、DB2 for iSeries を除く すべての DB2 ファミリー・バックエンドで使用できます。

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

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

オプティミスティック並行性制御は、ある特定のリソースが他のトランザクションで利用できなくなる時間を最小化することを目的としています。オプティミスティック・アクセス・インテントをセットアップする際は、オプティミスティック述部に組み込む属性を指定する必要があります。属性は、以下のように、UPDATE SQL ステートメントの WHERE 分節で指定します。
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 ステートメントについて詳しくは、 アクセス・インテント -- 分離レベルおよび更新ロックを参照してください。

ご利用条件 | フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.