アプリケーション開発の手引き


SQL プロシージャーのデバッグ

SQL プロシージャーを作成した後には、 CREATE PROCEDURE ステートメントの発行で記述されているように CREATE PROCEDURE ステートメントを発行する必要があります。ある場合では、 CREATE PROCEDURE ステートメントへの応答として DB2 によってエラーが戻されるかもしれません。 DB2 によって戻されたエラーについて、さらに情報を (エラーを訂正するための説明および提案) 検索するには、 CLP で以下のようなコマンドを発行します。

   db2 "? error-code"

ここで、 error-code は、エラーによって戻された SQLCODE または SQLSTATE を表します。たとえば、 CREATE PROCEDURE ステートメントが SQLCODE "SQL0469N" ("パラメーター・モードは無効です") 付きのエラーを戻す場合には、以下のようなコマンドを発行します。

   db2 "? SQL0469"

DB2 は以下のようなメッセージを戻します。

   Explanation:  One of the following errors occurred:
   o   a parameter in an SQL procedure is declared as OUT and is
       used as input in the procedure body
   o   a parameter in an SQL procedure is declared as IN and is
       modified in the procedure body.
   User Response:  Change the attribute of the parameter to INOUT,
   or change the use of the parameter within the procedure.

メッセージが表示された後は、 "User Response" セクションの提案に沿って SQL プロシージャーを変更してください。

SQL プロシージャーのエラー・メッセージを表示する

SQL プロシージャーの CREATE PROCEDURE ステートメントを発行すると DB2 は SQL プロシージャー本体の構文を受け入れるかもしれませんが、プリコンパイルまたはコンパイル段階において SQL プロシージャーを作成するのに失敗するかもしれません。このような状況下では、 DB2 は通常、エラー・メッセージを含むログ・ファイルを作成します。このログ・ファイルおよび他の中間ファイルは、 中間ファイルを使用した SQL プロシージャーのデバッグに記載されています。

SQL プロシージャーの DB2 および C コンパイラーで生成されたエラー・メッセージを検索するには、データベース・サーバー上の以下のディレクトリーでメッセージ・ログ・ファイルを表示します。

UNIX
$DB2PATH/function/routine/sqlproc/$DATABASE/$SCHEMA/tmp

ここで、$DB2PATH はインスタンス・ディレクトリーの位置を表し、$DATABASE はデータベース名を表し、 $SCHEMA は SQL プロシージャーを作成するのに使用されるスキーマ名を表します。

Windows NT
%DB2PATH%\function\routine\sqlproc\%DB%\%SCHEMA%\tmp

ここで、%DB2PATH% はインスタンス・ディレクトリーの位置を表し、%DB% はデータベース名を表し、 %SCHEMA% は SQL プロシージャーを作成するのに使用されるスキーマ名を表します。

さらに、アプリケーションの CALL ステートメントを発行して、サンプルのストアード・プロシージャーである db2udp!get_error_messages を呼び出せます。それには、以下のような構文を使用します。

   CALL db2udp!get_error_messages(schema-name, file-name, message-text)

ここで schema-name は、 SQL プロシージャーのスキーマを表す入力パラメーターです。 file-name は SQL プロシージャーの生成されたファイル名を表す入力パラメーターであり、 message-text はメッセージ・ログ・ファイルでメッセージ・テキストを戻す出力パラメーターです。

たとえば、以下のような Java アプリケーションを使用して SQL プロシージャーのエラー・メッセージを表示できます。

    public static String getErrorMessages(Connection  con,
      String procschema, String filename) throws Exception
    {
        String filecontents = null;
        // prepare the CALL statement
        CallableStatement stmt = null;
        try
        {
            String sql = "Call db2udp!get_error_messages(?, ?, ?) ";
            stmt = con.prepareCall (sql);
            // set all parameters (input and output)
            stmt.registerOutParameter( 3, java.sql.Types.LONGVARCHAR  );
            stmt.setString( 1, procschema );
            stmt.setString( 2, filename );
            // call the stored procedure
            boolean isrs = stmt.execute();
            filecontents = stmt.getString(3);
            System.out.println("SQL Procedure - getErrorMessages "
              + filecontents);
            return filecontents;
        }
        catch (Exception e) { throw e; }
        finally
        {
            if (stmt != null) stmt.close();
        }
    }

SQL プロシージャーのエラー・メッセージを表示するには、以下のような C アプリケーションを使用できます。

int getErrors(char inputSchema[9], char inputFilename[9],
                         char outputFilecontents[32000])
{
  EXEC SQL BEGIN DECLARE SECTION;
    char    procschema[100] = "";
    char    filename[100] = "";
    char    filecontents[32000] = "";
  EXEC SQL END DECLARE SECTION;
  strcpy (procschema, inputSchema);
  strcpy (filename, inputFilename);
  EXEC SQL CALL "db2udp!get_error_messages"
    (:procschema, :filename, :filecontents);
  if ( sqlca.sqlcode != 0 )
  {
    printf("Call failed. Code: %d\n", sqlca.sqlcode);
    return 1;
  }
  else
  {
    printf("\nSQL Procedure - getErrors:\n%s\n", filecontents);
  }
  strcpy (outputFilecontents, filecontents);
  return 0;
}
注:DB2 が作成するのに失敗した SQL プロシージャーのエラー・メッセージを表示する前に、SQL プロシージャーのプロシージャー名と生成されたファイル名の両方を知る必要があります。 CREATE PROCEDURE ステートメントの一部としてプロシージャー・スキーマ名が発行されないと、DB2 は CURRENT SCHEMA 特殊レジスターの値を使用します。 CURRENT SCHEMA 特殊レジスターの値を表示するには、 CLP で以下のようなステートメントを発行してください。

   VALUES CURRENT SCHEMA

中間ファイルを使用した SQL プロシージャーのデバッグ

SQL プロシージャーで CREATE PROCEDURE ステートメントを発行して DB2 が SQL プロシージャー本体の構文を受け入れる場合には、 DB2 はいくつかの中間ファイルを使用して SQL プロシージャーを作成します。 SQL プロシージャーが正常に作成されると、 DB2 は中間ファイルを除去してシステム資源を保護します。 DB2 によって CREATE PROCEDURE 構文が認められますが SQL プロシージャーの作成が失敗すると、プリコンパイル・バインド、および CREATE PROCEDURE プロセスのコンパイル段階を追跡するログ・ファイルが保持されます。

UNIX システムでは、 DB2 は中間ファイルを保持するため、 instance/function/routine/sqlproc/dbAlias/schema という基本ディレクトリーを使用します。ここで、instance は DB2 インスタンスのパスを表し、 dbAlias はデータベース別名を表します。また、schema は CREATE PROCEDURE ステートメントが発行されたスキーマを表します。

OS/2 および Windows 32 ビットのオペレーティング・システムでは、 DB2 は中間ファイルを保管するため、 instance\function\routine\sqlproc\dbAlias\ schema という基本ディレクトリーを使用します。ここで、instance は DB2 インスタンスのパスを表し、 dbAlias はデータベース別名を表します。また、schema は CREATE PROCEDURE ステートメントが発行されたスキーマを表します。

SQL プロシージャーが正常に作成されましたが、 CALL ステートメントから予期された結果が戻されない場合には、中間ファイルを調べることができるでしょう。 DB2 が中間ファイルを除去しないようにするには、以下のコマンドを使用して DB2_SQLROUTINE_KEEP_FILES DB2 レジストリー変数を "yes" に設定します。

   db2set DB2_SQLROUTINE_KEEP_FILES="yes"

DB2 でレジストリー変数の新しい値を使用するには、データベースを再始動する必要があります。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]