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. オプション: Db2® for z/OS® データ・ソースへの IBM Data Server Driver for JDBC and SQLJ タイプ 2 接続 接続時に、 SQLException.getMessage 呼び出しから SQL GET DIAGNOSTICS ステートメントによって提供される情報と同様の拡張診断情報が必要な場合は、extendedDiagnosticLevel プロパティーを EXTENDED_DIAG_MESSAGE_TEXT (241) に設定します。
  4. try ブロックで SQLException を生成できるコードを書き込みます。
  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. SQL 例外DB2Diagnosableのインスタンスであるかどうかをテストして、 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 
    }
}