DB2 Version 9.7 for Linux, UNIX, and Windows

IBM Data Server Driver for JDBC and SQLJ 使用時の SQLException の処理

すべての Java™ プログラムに共通する点ですが、JDBC アプリケーションの場合も、エラー処理は、try/catch ブロックで実行します。 エラーの発生時にメソッドが例外をスローすると、catch ブロックのコードがその例外を処理します。

IBM® Data Server Driver for JDBC and SQLJ で実行する JDBC プログラムで SQLException を処理するための基本手順は、以下のとおりです。

  1. com.ibm.db2.jcc.DB2Diagnosable インターフェースと com.ibm.db2.jcc.DB2Sqlca クラスに対するアクセス権をプログラムに与えます。 そのインターフェースとクラスへのすべての参照を完全に修飾するか、そのインターフェースとクラスをインポートできます。
    import com.ibm.db2.jcc.DB2Diagnosable;
    import com.ibm.db2.jcc.DB2Sqlca;
  2. オプション: データ・サーバーとの接続中に、SQLException.getMessage の呼び出しから完全なメッセージ・テキストを取得するには、retrieveMessagesFromServerOnGetMessage プロパティーを true に設定します。
  3. オプション: SQLException.getMessage 呼び出しから SQL GET DIAGNOSTICS ステートメントによって提供される情報と同様の詳細な診断情報を入手する場合は、IBM Data Server Driver for JDBC and SQLJ タイプ 2 接続DB2® for z/OS® データ・ソースに接続するときに、extendedDiagnosticLevel プロパティーを EXTENDED_DIAG_MESSAGE_TEXT (241) に設定します。
  4. SQLException を生成できるコードを try ブロックに配置します。
  5. catch ブロックのループの中で以下の手順を実行します。
    1. 最後の SQLException を取得したかどうかをテストします。 そうでない場合は、次の手順に進みます。
    2. オプション: IBM Informix® データ・ソースで実行する SQL ステートメントの場合は、com.ibm.db2.jcc.DB2Statement.getIDSSQLStatementOffSet メソッドを実行して、構文エラーがある列を判別します。

      DB2Statement.getIDSSQLStatementOffSet は、SQL ステートメントに含まれている最初の構文エラーのオフセットを返します。

    3. オプション: IBM Informix データ・ソースに対して実行される SQL ステートメントの場合、SQLException.getCause メソッドを実行して、ISAM エラー・メッセージを検索します。
      1. SQLException.getCause によって戻される Throwable が NULL でない場合、以下の手順のいずれか 1 つを実行します。
        • SQLException.printStackTrace を発行することにより、ISAM エラー・メッセージ・テキストを含むエラー・メッセージを出力します。 ISAM エラー・メッセージ・テキストは "Caused by:" というストリングの後にあります。
        • 次のようにして、ISAM メッセージのエラー・コードとメッセージ・テキストを検索します。
          1. ThrowableSQLException のインスタンスであるかどうかを検査します。 そうであれば、その SQLException から SQL エラー・コードを検索します。
          2. Throwable.getMessage メソッドを実行して、ISAM メッセージのテキストを検索します。
    4. SQLExceptionDB2Diagnosable のインスタンスであるかどうかをテストして、IBM Data Server Driver for JDBC and SQLJ のみの情報が存在するかどうかを確認します。 存在する場合は、以下のようにします。
      1. そのオブジェクトを DB2Diagnosable オブジェクトにキャストします。
      2. 省略可能: DB2Diagnosable.printTrace メソッドを呼び出して、すべての SQLException 情報を java.io.PrintWriter オブジェクトに書き出します。
      3. DB2Diagnosable.getThrowable メソッドを呼び出して、基礎になっている java.lang.ThrowableSQLException の原因かどうかを確認します。
      4. DB2Diagnosable.getSqlca メソッドを呼び出して、DB2Sqlca オブジェクトを取得します。
      5. DB2Sqlca.getSqlCode メソッドを呼び出して、SQL エラー・コード値を取得します。
      6. DB2Sqlca.getSqlErrmc メソッドを呼び出して、すべての SQLERRMC 値が含まれているストリングを取得するか、DB2Sqlca.getSqlErrmcTokens メソッドを呼び出して、SQLERRMC 値を配列として取得します。
      7. DB2Sqlca.getSqlErrp メソッドを呼び出して、SQLERRP 値を取得します。
      8. DB2Sqlca.getSqlErrd メソッドを呼び出して、SQLERRD 値を配列として取得します。
      9. DB2Sqlca.getSqlWarn メソッドを呼び出して、SQLWARN 値を配列として取得します。
      10. DB2Sqlca.getSqlState メソッドを呼び出して、SQLSTATE 値を取得します。
      11. DB2Sqlca.getMessage メソッドを呼び出して、データ・ソースからエラー・メッセージ・テキストを取得します。
    5. SQLException.getNextException メソッドを呼び出して、次の SQLException を取得します。

IBM Data Server Driver for JDBC and SQLJ に用意されている SQLException から IBM Data Server Driver for JDBC and SQLJ 固有の情報を取得するコードを以下に示します。 選択されたステートメントの右にある番号は、以前に説明されたステップに対応しています。

図 1. IBM Data Server Driver for JDBC and SQLJ 使用時の SQLException の処理
import java.sql.*;                      // Import JDBC API package
import com.ibm.db2.jcc.DB2Diagnosable;  // Import packages for DB2       1 
import com.ibm.db2.jcc.DB2Sqlca;        // SQLException support
java.io.PrintWriter printWriter;        // For dumping all SQLException
                                        // information
String url = "jdbc:db2://myhost:9999/myDB:" +                           2 
  "retrieveMessagesFromServerOnGetMessage=true;";
                                  // Set properties to retrieve full message
                                  // text
String user = "db2adm"; 
String password = "db2adm";
java.sql.Connection con = 
  java.sql.DriverManager.getConnection (url, user, password) 
                                  // Connect to a DB2 for z/OS data source


…
try {                                                                    4 
  // Code that could generate SQLExceptions
 …
} catch(SQLException sqle) {
    while(sqle != null) {             // Check whether there are more    5a 
                                      // SQLExceptions to process
 //=====> Optional IBM Data Server Driver for JDBC and SQLJ-only
 // error processing
      if (sqle instanceof DB2Diagnosable) {                              5d 
      // Check if IBM Data Server Driver for JDBC and SQLJ-only
      // information exists
          com.ibm.db2.jcc.DB2Diagnosable diagnosable = 
            (com.ibm.db2.jcc.DB2Diagnosable)sqle;                        5d1 
          diagnosable.printTrace (printWriter, "");                      5d2 
          java.lang.Throwable throwable = 
            diagnosable.getThrowable();                                  5d3 
          if (throwable != null) {
            // Extract java.lang.Throwable information 
            // such as message or stack trace.
            …
          }
          DB2Sqlca sqlca = diagnosable.getSqlca();                       5d4 
                                            // Get DB2Sqlca object
          if (sqlca != null) {              // Check that DB2Sqlca is not null
            int sqlCode = sqlca.getSqlCode(); // Get the SQL error code  5d5 
            String sqlErrmc = sqlca.getSqlErrmc();                       5d6 
                                            // Get the entire SQLERRMC
            String[] sqlErrmcTokens = sqlca.getSqlErrmcTokens();
                                            // You can also retrieve the
                                            // individual SQLERRMC tokens
            String sqlErrp = sqlca.getSqlErrp();                         5d7 
                                            // Get the SQLERRP
            int[] sqlErrd = sqlca.getSqlErrd();                          5d8 
                                            // Get SQLERRD fields
            char[] sqlWarn = sqlca.getSqlWarn();                         5d9 
                                            // Get SQLWARN fields
            String sqlState = sqlca.getSqlState();                       5d10 
                                            // Get SQLSTATE
            String errMessage = sqlca.getMessage();                      5d11 
                                            // Get error message

            System.err.println ("Server error message: " + errMessage);
 
            System.err.println ("--------------- SQLCA ---------------");
            System.err.println ("Error code: " + sqlCode);
            System.err.println ("SQLERRMC: " + sqlErrmc);
            If (sqlErrmcTokens != null) {
              for (int i=0; i< sqlErrmcTokens.length; i++) {
                System.err.println ("  token " + i + ": " + sqlErrmcTokens[i]);
              }
            }
            System.err.println ( "SQLERRP: " + sqlErrp );
            System.err.println (
              "SQLERRD(1): " + sqlErrd[0] + "¥n" +
              "SQLERRD(2): " + sqlErrd[1] + "¥n" +
              "SQLERRD(3): " + sqlErrd[2] + "¥n" +
              "SQLERRD(4): " + sqlErrd[3] + "¥n" +
              "SQLERRD(5): " + sqlErrd[4] + "¥n" +
              "SQLERRD(6): " + sqlErrd[5] );
            System.err.println (
              "SQLWARN1: " + sqlWarn[0] + "¥n" +
              "SQLWARN2: " + sqlWarn[1] + "¥n" +
              "SQLWARN3: " + sqlWarn[2] + "¥n" +
              "SQLWARN4: " + sqlWarn[3] + "¥n" +
              "SQLWARN5: " + sqlWarn[4] + "¥n" +
              "SQLWARN6: " + sqlWarn[5] + "¥n" +  
              "SQLWARN7: " + sqlWarn[6] + "¥n" +
              "SQLWARN8: " + sqlWarn[7] + "¥n" +
              "SQLWARN9: " + sqlWarn[8] + "¥n" +
              "SQLWARNA: " + sqlWarn[9] );
            System.err.println ("SQLSTATE: " + sqlState);
                                            // portion of SQLException
          }
      sqle=sqle.getNextException();     // Retrieve next SQLException       5e 
    }
}