IBM Support

[Db2] JCC4 は getColumnName/getColumnLabel の挙動が従来のバージョンと異なる

Question & Answer


Question

JDBC を使った照会で、列名に AS で別名を指定しても、アプリケーションから別名で参照できません。 以前のバージョンでは期待通り動作していましたが、なぜ参照できなくなったのでしょうか。また、元の動作に戻すことはできますか。

Cause

IBM Data Server Driver for JDBC and SQLJ バージョン 4.0 以降、ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel のデフォルトの動作が変更されています。

列名に AS で別名を指定している場合、バージョン 4.0 以前では ResultSetMetaData.getColumnName と ResultSetMetaData.getColumnLabel は別名を返しますが、バージョン 4.0 以降では ResultSetMetaData.getColumnName は元の列名を、ResultSetMetaData.getColumnLabel は別名を返します。
  • [サンプル・コード]
    Connection con = ds.getConnection();
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT EMPNO AS EMPLOYEE_NUMBER FROM EMPLOYEE");
    String colname = rsmd.getColumnName(1);
    String collabel = rsmd.getColumnLabel(1);
    System.out.println("Column Name: " + colname);
    System.out.println("Column Label: " + collabel);
    while(rs.next()){
            System.out.println("Employee Number: " + rs.getString(colname));
    }
    [バージョン 4.0 以前の実行結果]
    $ java ColumnName
    Column Name: EMPLOYEE_NUMBER
    Column Label: EMPLOYEE_NUMBER
    Employee Number: 000010
    [バージョン 4.0 以降の実行結果]
    $ java ColumnName
    Column Name: EMPNO
    Column Label: EMPLOYEE_NUMBER
    com.ibm.db2.jcc.am.SqlException: [jcc][10150][10300][4.13.80] パラメーターが無効です: 列名 EMPNO は不明です。 ERRORCODE=-4460, SQLSTATE=null
            at com.ibm.db2.jcc.am.id.a(id.java:661)
            at com.ibm.db2.jcc.am.id.a(id.java:60)
            at com.ibm.db2.jcc.am.id.a(id.java:103)
            at com.ibm.db2.jcc.am.hb.a(hb.java:2117)
            at com.ibm.db2.jcc.am.tn.a(tn.java:1932)
            at com.ibm.db2.jcc.am.tn.getString(tn.java:1704)
            at ColumnName.run(ColumnName.java:37)
            at ColumnName.main(ColumnName.java:9)

Answer

バージョン 4.0 以前と同様の動作に戻すためには、useJDBC4ColumnNameAndLabelSemantics プロパティーに DB2BaseDataSource.NO (2) を指定してください。
以前と同様、ResultSetMetaData.getColumnName と ResultSetMetaData.getColumnLabel はどちらも別名を返すようになります。
  • [サンプル・コード]
    ((DB2BaseDataSource) ds).setUseJDBC4ColumnNameAndLabelSemantics(DB2BaseDataSource.NO);
    Connection con = ds.getConnection();
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT EMPNO AS EMPLOYEE_NUMBER FROM EMPLOYEE");
    String colname = rsmd.getColumnName(1);
    String collabel = rsmd.getColumnLabel(1);
    System.out.println("Column Name: " + colname);
    System.out.println("Column Label: " + collabel);
    while(rs.next()){
            System.out.println("Employee Number: " + rs.getString(colname));
    }
    [バージョン 4.0 以降の実行結果]
    $ java TestSelect
    Column Name: EMPLOYEE_NUMBER
    Column Label: EMPLOYEE_NUMBER
    Employee Number: 000010
運用上の考慮点
WebSphere Application Server 上の Web アプリケーションに useJDBC4ColumnNameAndLabelSemantics プロパティーを設定するには、お使いのデータソースのカスタム・プロパティを変更してください。

関連情報
IBM Data Server Driver for JDBC and SQLJ のバージョン間での JDBC の相違点
ResultSetMetaData.getColumnName および ResultSetMetaData.getColumnLabel の値の例
Db2 サーバーに共通の IBM Data Server Driver for JDBC and SQLJ のプロパティー
[Db2] Db2 が提供している JDBC ドライバーの種類
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmVAAU","label":"Programming Interface-\u003EJDBC"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
26 October 2023

UID

swg21601214