■質問日: |
2011/09/05 |
■最終更新日: |
2011/09/05 |
■質問内容: |
Oracle JDBC Driver 10.xを使用したとき、「項目エラー(… 項目名 …)文字列が長すぎます。」というエラーが出ます。 (1)カラム定義: col1 varchar2(10) (2)SQLで以下を設定 decode(col1, "あいう") col2 (3)プログラムで以下を設定 setValueAsString(col2, "うえおかき") →「項目エラー(… 項目名 …)文字列が長すぎます。」 |
■回答内容: |
(1)例えば、以下のようなカラムがあったとします。 col1 varchar2(10) (2)以下のようなSQLを書いたとします。 DECODE(table1.col1,NULL, 'ああ','いい') col2 WDCでは、JDKの java.sql.ResultSetMetaData#getColumnDisplaySize(int) とうメソッドを使用してカラムの長さを決定します。 このメソッドの動作が、Oracle JDBC Driver 9.xと10.xでは異なります。 例えば、"ああ"という文字の場合、 Oracle JDBC Driver 9.0.1: 長さ=4を返却(バイトで返却) Oracle JDBC Driver 10.x : 長さ=2を返却(文字数で返却) となります。 WDCでは、OracleのNLS_LENGTH_SEMANTICSがBYTEになっていれば、BYTEで扱いますが、 Oracleではdecodeなどの文字列操作が入ると文字数で扱うようになりました。 このSQLの場合、Oracleから返ってきたcol2の「2(文字)」を、WDCは「2(バイト)」と扱います。 (3)setValueAsString(col2, 'うう') WDCはバイトで扱うので2バイトとして扱うため、setValueAsString(col2, 'うう')とすると、 2バイトの長さに4バイトのデータを入れようとしているためエラーとなります。 このような現象が起きるのは、データベースのテーブルのカラムをそのまま使わず、 SQLで加工したカラムに全角の値をセットする場合です。 加工の例は以下です。 ・SQLでdecodeを使用している ・SQLで文字連結で文字を加工したものである。 ・DUAL表から取得している。 (例)SELECT 'あいうえお' MEISHOU FROM DUAL ・SQLでto_charを使用している。 (例)select to_char(sysdate,'eeyy/mm/dd hh24:mi:ss','nls_calendar = ''Japanese Imperial''') from dual; 結果に平成18/03/30 00:59:29のように全角を含む場合も該当します。 【対応策】 (A)ソースコード修正 次のように 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(); } } (B)ソースコード修正 Oracleの挙動に対応するため、パッチWDC1.3_201では、 長さチェックをバイト数ではなく、文字数で行うためのシステムプロパティを追加しました。 パッチWDC1.3_201はJDK1.5以上対応ですので、JDK1.5以上であればご使用ください。 文書番号380も合わせてご参照ください。 |
■添付資料: |
なし |