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 プロシージャーの CREATE PROCEDURE ステートメントを発行すると DB2 は SQL プロシージャー本体の構文を受け入れるかもしれませんが、プリコンパイルまたはコンパイル段階において SQL プロシージャーを作成するのに失敗するかもしれません。このような状況下では、 DB2 は通常、エラー・メッセージを含むログ・ファイルを作成します。このログ・ファイルおよび他の中間ファイルは、 中間ファイルを使用した SQL プロシージャーのデバッグに記載されています。
SQL プロシージャーの DB2 および C コンパイラーで生成されたエラー・メッセージを検索するには、データベース・サーバー上の以下のディレクトリーでメッセージ・ログ・ファイルを表示します。
ここで、$DB2PATH はインスタンス・ディレクトリーの位置を表し、$DATABASE はデータベース名を表し、 $SCHEMA は SQL プロシージャーを作成するのに使用されるスキーマ名を表します。
ここで、%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 プロシージャーで 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 でレジストリー変数の新しい値を使用するには、データベースを再始動する必要があります。