■質問日: |
2006/07/13 |
■最終更新日: |
2011/09/05 |
■質問内容: |
Oracle JDBC Driver を 9.x から 10.x に変更しようと考えていますが 何か注意点はあるでしょうか? |
■回答内容: |
※Oracle JDBC Driver 10.xに対応しているのは WDC 1.20-047p11以降(p11含む)およびWDC 1.30-012以降(012含む)です。 それ以前のWDCは、Oracle JDBC Driver 10.xに対応しておりません。 注意点は2つあります。 【1.文字列連結したカラムの長さ】 WDCではカラムの長さをResultSetMetaDataから取得していますが、 この値が 9.x と 10.x とで異なる場合があります。 異なるのは次のような状況です。 TABLE CUSTOMER ( CUSTOMER_CD VARCHAR(10), CUSTOMER_NAME VARCHAR(20) ) というようなテーブルがある場合に、 ClientRowSet(またはSQLRowSet)に次のようなSQLを記述します。 SELECT CUSTOMER_CD, CUSTOMER_NAME || '様' AS CUSTOMER_NAME FROM CUSTOMER ※ポイント:カラム値に2バイト文字を連結させた文字列をカラム値として 取得します。 この場合、CUSTOMER_CD, CUSTOMER_NAMEの長さはそれぞれ10, 22となるはずですが Oracle JDBC Driver 10.2.0.1(THIN) を使用すると、10, 21が返ってきます。 これは、Oracle JDBC Driver 10.2.0.1 の仕様と思われます。 (なお、Oracle JDBC Driver 9.x(THIN) では、10, 22が返ってきます。) この後、 rsCustomer.setString("CUSTOMER_NAME", "あいうえおかきくけこ様"); というような操作を行うと、長さエラーが発生します。 (長さ:21のカラムに、22バイトの文字列を設定しようとしたため。) 回避策: 次のように onColumnSetup で、Lengthに正しい値を設定してください。 public void onColumnSetup(DataHandleEvent e) { super.onColumnSetup(e); try { if (e.getSource() == rsCustomer) { rsCustomer.getColumn("CUSTOMER_NAME").setLength(22); } } catch (DataHandleException x) { x.printStackTrace(); } } 上記のようなSQLを書いていなければ問題ありません。 また、上記のようなSQLを書いていた場合でも、 rsCustomer.setString("CUSTOMER_NAME", "あいうえおかきくけこ様"); のように、そのカラムの値を変更するような処理がなければ問題ありません。 文書番号701も合わせてご参照ください。 【2.BLOBの更新】 Oracle JDBC Driver 9.xを利用して、BLOB型のカラムを更新する場合は、 SQLHandlerに対するヘルパークラスの設定が必要です。 Oracle JDBC Driver 10.xを利用する場合には、BLOB型のカラムを更新する場合でも SQLHandlerに対するヘルパークラスの設定は不要です。 (設定すると、BLOB型のカラムを更新できない場合があります。) |
■添付資料: |
なし |