JDBC アプリケーションを古いドライバーから IBM® Data Server Driver for JDBC and SQLJ にアップグレードする前に、それらのドライバー間の相違点を理解する必要があります。
JDBC ドライバーによりサポートされるメソッドの比較については、『JDBC API でのドライバーのサポート』を参照してください。
IBM Data Server Driver for JDBC and SQLJ バージョン 3.50 以降の場合、連続ストリーミングの使用は、DB2 for Linux, UNIX, and Windows バージョン 9.5 以降への接続の場合の LOB 検索のデフォルトです。
連続ストリーミングは IBM Data Server Driver for JDBC and SQLJ バージョン 3.1 以降でサポートされています。 ただし、IBM Data Server Driver for JDBC and SQLJ バージョン 3.2 以降では、連続ストリーミングの使用は、DB2 for z/OS® バージョン 9.1 以降への接続の場合の LOB および XML 検索のデフォルトです。
IBM Data Server Driver for JDBC and SQLJ の以前のバージョンおよび DB2 JDBC Type 2 ドライバーは、連続ストリーミングをサポートしませんでした。
…
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM MY_TABLE");
rs.next(); // Retrieve the first row of the ResultSet
Clob clobFromRow1 = rs.getClob(1);
// Put the CLOB from the first column of
// the first row in an application variable
String substr1Clob = clobFromRow1.getSubString(1,50);
// Retrieve the first 50 bytes of the CLOB
rs.next(); // Move the cursor to the next row.
// clobFromRow1 is no longer available.
// String substr2Clob = clobFromRow1.getSubString(51,100);
// This statement would yield an SQLException
Clob clobFromRow2 = rs.getClob(1);
// Put the CLOB from the first column of
// the second row in an application variable
rs.close(); // Close the ResultSet.
// clobFromRow2 is also no longer available.
rs.next() を実行してカーソルを ResultSet の 2 番目の行に置いた後は、clobFromRow1 内の CLOB 値は使用できなくなります。 同様に、rs.close() を実行して ResultSet をクローズした後、clobFromRow1 および clobFromRow2 内の値は使用できなくなります。この動作の変更によるエラーを避けるには、以下のアクションのいずれかをとる必要があります。
LOB データをアプリケーション変数に取り出すアプリケーションは、データの取り出しに使用されたカーソルが移動されるか閉じられるまでの間に限り、それらのアプリケーション変数のデータを操作できます。
IBM Data Server Driver for JDBC and SQLJ バージョン 4.0 以降の場合、ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel のデフォルトの動作は、それ以前の JDBC ドライバーのデフォルトの動作とは異なります。
IBM Data Server Driver for JDBC and SQLJ バージョン 4.0 以降を使用する必要があるが、アプリケーションが旧バージョンの JDBC ドライバーで戻された ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel の値を戻す必要がある場合、useJDBC4ColumnNameAndLabelSemantics Connection および DataSource プロパティーを DB2BaseDataSource.NO (2) に設定できます。
IBM Data Server Driver for JDBC and SQLJ バージョン 3.52 以降では、自動生成キーの取り出し対応の SQL ステートメントを準備する機能がサポートされています。
IBM Data Server Driver for JDBC and SQLJ バージョン 3.50 またはバージョン 3.51 を使用する場合、SQL ステートメントを自動生成キーの取り出しのために準備し、バッチ更新に PreparedStatement オブジェクトを使用すると、SQLException が出されます。
IBM Data Server Driver for JDBC and SQLJ のバージョン 3.50 より前のバージョンは、自動生成キーを戻すように準備された PreparedStatement オブジェクトに対してアプリケーションが addBatch または executeBatch メソッドを呼び出すときに、SQLException をスローしません。 ただし、PreparedStatement オブジェクトは自動生成キーを戻しません。
IBM Data Server Driver for JDBC and SQLJ バージョン 2.6 以降で実行される JDBC または SQLJ アプリケーションで、タイプ 4 接続が使用されている場合、DB2 for z/OS CURRENT CLIENT_ACCTNG 特殊レジスターの初期値は、DB2 for z/OS のバージョン番号と clientWorkStation プロパティーの値とを連結したものです。 JDBC ドライバー、バージョン、または接続のいずれかがそれとは異なる場合、初期値は設定されていません。
IBM Data Server Driver for JDBC and SQLJ は、スクロール可能 ResultSet および更新可能 ResultSet をサポートします。
DB2 JDBC Type 2 ドライバーはスクロール可能 ResultSet をサポートしますが、更新可能 ResultSet はサポートしません。
IBM Data Server Driver for JDBC and SQLJ は、他のドライバーとは異なり、内部エラーには既存の SQLCODE または SQLSTATE を使用しません。 『IBM Data Server Driver for JDBC and SQLJ から発行されるエラー・コード』と『IBM Data Server Driver for JDBC and SQLJ から発行される SQLSTATE』を参照してください。
JDBC/SQLJ driver for OS/390® and z/OS で内部エラーが発生した場合、ODBC SQLSTATE が返されます。
IBM Data Server Driver for JDBC and SQLJ では、SQLException.getMessage() を実行する際に、retrieveMessagesFromServerOnGetMessage プロパティーが true に設定されていなければ、フォーマット済みメッセージ・テキストは戻されません。
DB2 JDBC Type 2 ドライバーでは、SQLException.getMessage() を実行すると、フォーマット済みメッセージ・テキストが戻されます。
JDBC ドライバーには様々なセキュリティー・メカニズムがあります。
IBM Data Server Driver for JDBC and SQLJ セキュリティー・メカニズムについては、『IBM Data Server Driver for JDBC and SQLJ 使用時のセキュリティー』を参照してください。
DB2 JDBC Type 2 ドライバーのセキュリティー・メカニズムについては、『DB2 JDBC Type 2 ドライバー使用時のセキュリティー』を参照してください。
IBM Data Server Driver for JDBC and SQLJ では、Connection または DataSource オブジェクトの readOnly プロパティーにより、接続を読み取り専用にすることができます。
DB2 JDBC Type 2 ドライバーは、接続を読み取り専用にするかどうかを判別する際に Connection.setReadOnly 値を使用します。 ただし、Connection.setReadOnly(true) を設定しても、接続が読み取り専用になるとは限りません。
IBM Data Server Driver for JDBC and SQLJ は、CHAR FOR BIT DATA または VARCHAR FOR BIT DATA 列について ResultSet.getString 呼び出しからのデータを小文字の 16 進数ストリングとして戻します。
DB2 JDBC Type 2 ドライバーはデータを大文字の 16 進数ストリングとして戻します。
デフォルトで、IBM Data Server Driver for JDBC and SQLJ は、ResultSet.getString 呼び出しによって TIMESTAMP 列値のデータを返すとき、後続ゼロを切り捨てます。 この動作は、timestampPrecisionReporting プロパティーで変更することができます。
DB2 JDBC Type 2 ドライバーは、ResultSet.getString 呼び出しによって TIMESTAMP 列値のデータを返すとき、後続ゼロを切り捨てません。
executeUpdate 呼び出しがどの行にも影響を与えない場合、IBM Data Server Driver for JDBC and SQLJ は SQLWarning を生成します。
DB2 JDBC Type 2 ドライバーは SQLWarning を生成しません。
getDate または getTime 呼び出しが TIMESTAMP 列に対して行われる場合、IBM Data Server Driver for JDBC and SQLJ は SQLWarning を生成しません。
getDate または getTime 呼び出しが TIMESTAMP 列に対して行われる場合、DB2 JDBC Type 2 ドライバーは SQLWarning を生成します。
SQL の DATE、TIME、または TIMESTAMP 列のデータを更新したり取り出したりする際に、現実の日付および時刻に対応しない日付および時刻の値は、IBM Data Server Driver for JDBC and SQLJ によって調整されます。 例えば、TIMESTAMP 列を更新して値を 2007-12-31 24:00:00.0 にしようとすると、IBM Data Server Driver for JDBC and SQLJ によってその値は 2008-01-01 00:00:00.0 に調整されます。 TIMESTAMP 列を更新して値を 9999-12-31 24:00:00.0 にしようとすると、調整後の値 10000-01-01 00:00:00.0 が無効であるため、IBM Data Server Driver for JDBC and SQLJ により例外がスローされます。
DB2 JDBC Type 2 Driver for Linux, UNIX and Windows では、現実の日付または時刻に対応しない日付または時刻の値に対して調整処理が実行されません。 このドライバーでは、データベースとの間で値がそのままやり取りされます。 例えば、DB2 JDBC Type 2 Driver for Linux, UNIX and Windows で TIMESTAMP 列を更新して値を 9999-12-31 24:00:00.0 にしようとしても、例外はスローされません。 詳しくは、『JDBC および SQLJ アプリケーションで問題が発生する可能性のある日付、時刻、およびタイム・スタンプの値』を参照してください。
DB2 JDBC Type 2 Driver for Linux, UNIX and Windows の場合、DATE、TIME、または TIMESTAMP 列のデータを取り出してストリング変数に入れる場合のデフォルトの形式は、CLI のキーワード DateTimeStringFormat によってデフォルトの形式を変更したのでない限り、JIS 形式です。
IBM Data Server Driver for JDBC and SQLJ の場合、DATE、TIME、または TIMESTAMP 列データをストリングに取り出すためのデフォルト形式は ISO です。ただし、dateFormat または timeFormat Connection またはDataSource プロパティーによってこのデフォルト形式が変更された場合は例外です。
PreparedStatement.setBinaryStream、PreparedStatement.setCharacterStream、または PreparedStatement.setUnicodeStream メソッドを使用する場合、length パラメーター値は入力ストリーム内のバイト数に一致しなければなりません。
バイト数が一致しない場合、後続の PreparedStatement.executeUpdate メソッドが実行するまで、IBM Data Server Driver for JDBC and SQLJ は例外をスローしません。 そのため、IBM Data Server Driver for JDBC and SQLJ では、長さが一致しないと、一部のデータがサーバーに送信されることがあります。 そのデータはサーバーによって切り捨てられるかまたは埋め込まれます。 呼び出し側アプリケーションはロールバック要求を出して、切り捨てられたデータまたは埋め込まれたデータを含むデータベース更新を取り消す必要があります。
DB2 JDBC Type 2 ドライバーは、PreparedStatement.setBinaryStream、PreparedStatement.setCharacterStream、または PreparedStatement.setUnicodeStream メソッドが実行した後、例外をスローします。
IBM Data Server Driver for JDBC and SQLJ では、PreparedStatement.setBinaryStream、PreparedStatement.setCharacterStream、または PreparedStatement.setUnicodeStream メソッドを使用しており、ターゲット列のデータ・タイプに関する情報を使用できない場合、入力データは BLOB または CLOB データ・タイプにマップされます。
DB2 JDBC Type 2 ドライバーの場合、入力データは VARCHAR FOR BIT DATA または VARCHAR データ・タイプにマップされます。
文字データがクライアントとサーバーとの間で転送される場合、データは受信側が処理できる形式に変換される必要があります。
IBM Data Server Driver for JDBC and SQLJ の場合、データ・ソースからクライアントに送信される文字データは Java の組み込み文字コンバーターを使用して変換されます。 IBM Data Server Driver for JDBC and SQLJ がサポートする変換は、基礎となる JRE インプリメンテーションによってサポートされるものに制限されます。
タイプ 4 接続を使用する IBM Data Server Driver for JDBC and SQLJ クライアントは、データを Unicode UTF-8 としてデータ・ソースに送信します。
DB2 JDBC Type 2 ドライバーでは、文字変換が DB2 サーバーによってサポートされる場合に変換を実行できます。
GRAPHIC 列に 1 バイト文字が含まれる場合 (エラー条件)、DB2 JDBC Type 2 ドライバーはデータ取り出しの際に文字変換を実行します。その際にエラーは発行されませんが、結果が正しくない場合があります。IBM Data Server Driver for JDBC and SQLJ がエラーを発行します。
ASCII データ以外の文字データが getAsciiStream を使用して CLOB 列から取得されると、DB2 JDBC Type 2 ドライバーはデータ取得の際に文字変換を正しく実行します。IBM Data Server Driver for JDBC and SQLJ は、文字変換を正しく実行しません。getAsciiStream を使用するのは、ASCII データを取り出す場合だけにしてください。他のタイプの文字データの場合、getCharacterStream または getString を代わりに使用してください。
これらのドライバーはデータ・ソースからの CCSID 情報を使用します (使用可能な場合)。 ドライバーは入力パラメーター・データを送信する前に、そのデータをデータ・ソースの CCSID に変換します。 ターゲット CCSID 情報が使用不可の場合、ドライバーはデータを Unicode UTF-8 として送信します。
PreparedStatement.setXXX メソッドを実行し、setXXX メソッドから生成されるデータ・タイプがパラメーター値が割り当てられている表列のデータ・タイプに一致しない場合、データ・タイプの変換が行われなければ、ドライバーはエラーを戻します。
IBM Data Server Driver for JDBC and SQLJ では、 ターゲット・データ・タイプが認識されている場合、および deferPrepares と sendDataAsIs 接続プロパティーが false に設定されている場合に、正しい SQL データ・タイプへの変換が暗黙的に行われます。 この場合、setXXX 呼び出しで暗黙値が明示値をオーバーライドします。 deferPrepares 接続プロパティーまたは sendDataAsIs 接続プロパティーが true に設定されている場合、PreparedStatement.setObject メソッドを使用してパラメーターを正しい SQL データ・タイプに変換する必要があります。
DB2 JDBC Type 2 ドライバーの場合、パラメーターのデータ・タイプがそのデフォルト SQL データ・タイプに一致しなければ、PreparedStatement.setObject メソッドを使用してパラメーターを正しい SQL データ・タイプに変換する必要があります。
setObject(parameterIndex, x, java.sqlTypes.BINARY)
DB2 JDBC Type 2 ドライバーはこのタイプの呼び出しをサポートします。 ドライバーは x の値を 16 進数ストリングと解釈します。
IBM Data Server Driver for JDBC and SQLJ の場合、10 進入力パラメーターを指定して PreparedStatement.setObject を呼び出すときに、入力パラメーターのスケールがターゲット列のスケールより大きければ、ドライバーは入力値の末尾桁を切り捨ててからその値を列に割り当てます。
DB2 JDBC Type 2 ドライバーは入力値の末尾桁を丸めてから、その値を列に割り当てます。
推奨されない形式の ResultSet.getBigDecimal には、第 2 のパラメーターとして scale パラメーターがあります。IBM Data Server Driver for JDBC and SQLJ では、0 から 32 の範囲のスケール・パラメーターを許可します。
DB2 JDBC Type 2 ドライバーは -1 から 32 の範囲を許可します。
setObject(parameterIndex, x)
DB2 JDBC Type 2 ドライバーは 、java.lang.Character から CHAR への x の非標準マッピングをサポートします。
IBM Data Server Driver for JDBC and SQLJ は、文字列に FOR BIT DATA 属性が含まれる場合にのみ、その文字列を表す引数を指定した ResultSet.getBinaryStream をサポートします。
DB2 JDBC Type 2 ドライバーの場合、ResultSet.getBinaryStream 引数が文字列であれば、列には FOR BIT DATA 属性がなくてもかまいません。
IBM Data Server Driver for JDBC and SQLJ では、ResultSet.getString をバイナリー列に対して実行する場合、戻されるデータの形式は小文字の 16 進数字の対です。
DB2 JDBC Type 2 ドライバーでは、バイナリー列に対して ResultSet.getString を実行したときに戻されるデータの形式は、大文字の 16 進数字の対です。
IBM Data Server Driver for JDBC and SQLJ では、PreparedStatement.setObject(parameterIndex,x,CHAR) を実行しており、x がブール値の場合、値 "0" または "1" が表列に挿入されます。
DB2 JDBC Type 2 ドライバーでは、ストリング "false" または "true" が表列に挿入されます。 表列の長さは少なくとも 5 でなければなりません。
IBM Data Server Driver for JDBC and SQLJ では、ResultSet.getBoolean または CallableStatement.getBoolean を実行して CHAR 列からブール値を取り出すときに、列に値 "false" または "0" が含まれる場合、値 false が戻されます。 列にそれ以外の値が含まれる場合、true が戻されます。
DB2 JDBC Type 2 ドライバーでは、ResultSet.getBoolean または CallableStatement.getBoolean を実行して CHAR 列からブール値を取り出すときに、列に値 "true" または "1" が含まれる場合、値 true が戻されます。 列にそれ以外の値が含まれる場合、false が戻されます。
IBM Data Server Driver for JDBC and SQLJ を使用する場合、ResultSet からすべての行が取得されると、カーソルは自動的に閉じます。カーソルが閉じた後に ResultSet.next を実行すると、SQLException がスローされます。 この動作は、JDBC 標準に準拠します。
DB2 JDBC Type 2 ドライバーを使用する場合、ResultSet からすべての行が取得されても、カーソルは閉じません。すべての行が取得された後に ResultSet.next が実行されると、false の値が戻り、例外はスローされません。
IBM Data Server Driver for JDBC and SQLJ では、JDBC 仕様で null が許可されている場合にのみ、DatabaseMetaData メソッド呼び出しで引数に null を指定できます。 そうでない場合、例外がスローされます。
DB2 JDBC Type 2 ドライバーでは、null は、検索を絞り込むために引数を使用しないことを意味します。
IBM Data Server Driver for JDBC and SQLJ では、ResultSetMetaData.getColumnTypeName は CHAR FOR BIT DATA 列の CHAR FOR BIT DATA、および VARCHAR FOR BIT DATA 列の VARCHAR FOR BIT DATA を返します。
DB2 JDBC Type 2 Driver では、ResultSetMetaData.getColumnTypeName は CHAR FOR BIT DATA 列の CHAR () FOR BIT DATA、および VARCHAR FOR BIT DATA 列の VARCHAR () FOR BIT DATA を返します。
IBM Data Server Driver for JDBC and SQLJ は、メソッド呼び出し内のどの引数も大文字に変換しません。
Statement.setCursorName("¥"mycursor¥"");
{t 'hh:mm:ss'}
{ts 'hh:mm:ss'}
IBM Data Server Driver for JDBC and SQLJ は、ステートメント・バッチ内の CALL ステートメントをサポートします。
DB2 JDBC Type 2 ドライバーは、ステートメント・バッチ内の CALL ステートメントをサポートしません。
IBM Data Server Driver for JDBC and SQLJ は SQL ステートメント・テキストをデータ・ソースに渡す前に、空白文字 (スペース、タブ、改行文字など) をそのテキストから除去しません。
DB2 JDBC Type 2 ドライバーは、SQL ステートメント・テキストをデータ・ソースに渡す前に、空白文字をそのテキストから除去します。
PreparedStatement.executeBatch ステートメントが IBM Data Server Driver for JDBC and SQLJ を使用して実行されると、ドライバーは更新カウントの int 配列を戻します。 配列の各エレメントには、バッチ内のステートメントによって更新された行数が含まれます。
PreparedStatement.executeBatch ステートメントが DB2 JDBC Type 2 ドライバーを使用して実行されると、ドライバーは更新カウントを判別できないため、更新カウントごとに -3 を戻します。
IBM Data Server Driver for JDBC and SQLJ ドライバーはコンパウンド SQL ブロックをサポートしません。
EXEC SQL BEGIN COMPOUND ATOMIC STATIC
UPDATE ACCOUNTS SET ABALANCE = ABALANCE + :delta
WHERE AID = :aid;
UPDATE TELLERS SET TBALANCE = TBALANCE + :delta
WHERE TID = :tid;
INSERT INTO TELLERS (TID, BID, TBALANCE) VALUES (:i, :branch_id, 0);
COMMIT;
END COMPOUND;
DB2 JDBC Type 2 ドライバーは、PreparedStatement.executeUpdate または Statement.executeUpdate を使用してコンパウンド SQL ブロックの実行をサポートします。
パラメーターが設定されていない場合、IBM Data Server Driver for JDBC and SQLJ ドライバーは PreparedStatement.addBatch 呼び出しの後で例外をスローします。
パラメーターがバッチ内のいずれのステートメントにも設定されていない場合、DB2 JDBC Type 2 ドライバーは PreparedStatement.executeBatch 呼び出しの後で例外をスローします。
IBM Data Server Driver for JDBC and SQLJ ドライバーでは、DB2 カタログで定義されていないストアード・プロシージャーを呼び出すことはできません。
DB2 JDBC Type 2 ドライバーでは、DB2 カタログで定義されていないストアード・プロシージャーを呼び出すことができます。
IBM Data Server Driver for JDBC and SQLJ ドライバーでは、データ・ソースが CALL ステートメントの動的実行をサポートしていない場合、ストアード・プロシージャー定義で指定されたとおりに正確に CALL ステートメント・パラメーターを指定する必要があります。
OUT PARM1 DECIMAL(3,0)
呼び出し側アプリケーションでは、cs.registerOutParameter(1,
Types.DECIMAL) のようなステートメントは正しくありません。
データ・タイプ cs.registerOutParameter
(1, Types.DECIMAL, 0) だけでなくスケールを指定する形式の registerOutParameter メソッドを使用する必要があります。DB2 JDBC Type 2 ドライバーでは、呼び出しアプリケーションのパラメーター・データ・タイプが CREATE PROCEDURE ステートメントのデータ・タイプと一致している必要はありません。
IBM Data Server Driver for JDBC and SQLJ が SQL ステートメントを準備する場合、ステートメントをデータ・サーバーに送信する際、追加処理は何も行いません。そのため、IBM Data Server Driver for JDBC and SQLJ を使用して末尾がセミコロンの SQL ステートメントを準備すると、エラーを受け取ります。
DB2 JDBC Type 2 ドライバーが最後にセミコロンが含まれる SQL ステートメントを準備する場合、そのセミコロンを除去します。そのため、SQL ステートメントに有効な構文が含まれていれば、正常に実行されます。
例えば、以下のコードは IBM Data Server Driver for JDBC and SQLJ では失敗しますが、DB2 JDBC Type 2 ドライバーでは正常に実行されます。
PreparedStatement pstmt1 = con.prepareStatement("SELECT c1,c2 FROM testtab;");
同時にオープンしたままにできる Statement または PreparedStatement オブジェクトの数は、IBM Data Server Driver for JDBC and SQLJの場合よりも、DB2 Type 2 Driver for Linux, UNIX, and Windows の場合のほうが大きくなります。 IBM Data Server Driver for JDBC and SQLJ においてエラー・コード -805 を受け取ることになるまでにオープンできる Statement または PreparedStatement オブジェクトの数は、DB2 Type 2 Driver for Linux, UNIX, and Windows の場合よりも少なくなります。 この相違は、こうしたオブジェクトの基本リソースをドライバーが処理する方法によって生じます。