この項では、ストアド プロシージャ ベースのアプリケーションをデバッグする場合の指針を解説します。
- SQL INSERT文
- 情報を記録するための特別なストアド プロシージャ
完璧な方法というものはありませんが、これらデバッグおよびテスト技法はバグを最小限にするのに役立ちます。
デバッグ方法の比較
以下の表は、これら2つの方法の長所と短所を説明しています。これらの方法は、実際の要件に基づいて評価してください。
メソッド | 利点 | 短所 |
---|---|---|
INSERT文 | ログ項目をユーザー定義ログ テーブルに挿入することができ、ストアド プロシージャの実行後にログ テーブルを問合わせることによって結果を参照することができます。 | デバッグの後で、ストアド プロシージャ本体内の1つ以上のINSERT文を使用不能にするかまたは除去してから、プロシージャを再コンパイルする必要があります。 |
デバッグ ストアド プロシージャ | 標準的なプロシージャを定義してストアド プロシージャをデバッグします。 | デバッグの後で、ストアド プロシージャ本体内の1つ以上のCALL文を使用不能にするかまたは除去してから、プロシージャを再コンパイルする必要があります。 |
デバッグでのINSERT文の使用
ストアド プロシージャではINSERT文を使用して、任意のテーブルに任意の値またはテキストを挿入できます。以下に示すストアド プロシージャの定義を考えてください。
REPLACE PROCEDURE spRow (OUT pRowCount INTEGER) BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN INSERT ErrorLogTable (’spRow’, :SQLSTATE, :SQLCODE); END; SET pRowCount = 0; FOR vFor AS cName CURSOR FOR SELECT c1 as a, c2 * 10 as b FROM ValueTable DO SET pRowCount = pRowCount + 1; INSERT LogTable (pRowCount, vFor.a, vFor.b); ... ... ... END FOR; END;
ストアド プロシージャを実行すると、カーソルから取り出される各行ごとに、FOR文内に指定したINSERT文が実行されます。それによって、テーブルValueTableの行カウント、列c1、および列c2の値が挿入されます。
ストアド プロシージャの実行中に例外条件または完了条件が生じたら、宣言されている汎用の条件ハンドラーを使って処理される場合、そのハンドラ内に指定されているINSERT文が実行されます。そのようなINSERT文は、ストアド プロシージャ名、およびSQLCODEとSQLSTATEステータス変数の値をErrorLogTableに挿入します。このテーブルを問合わせれば、ストアド プロシージャの実行中に例外があったかどうかを確かめることができます。
デバッグ ストアド プロシージャの使用
ユーザーIDなどを使用して標準ログ テーブルに任意の生成テキストを記録する、サイト固有またはアプリケーション固有のストアド プロシージャを作成できます。以下に示すストアド プロシージャの定義を考えてください。
CREATE PROCEDURE LogDatabase.spDebug (IN spName CHAR(30), IN Text CHAR(255)) BEGIN -- Exit in case of any exception. DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN INSERT ErrorLogTable (spName, :SQLSTATE, :SQLCODE); END; -- Log the text in the DebugTable. INSERT INTO LogDatabase.DebugTable(spName, USER, CURRENT_DATE, CURRENT_TIME, Text) END;
spDebugプロシージャは、事前に定義されているデータベースLogDatabase内に作成されます。このプロシージャは、既存のDebugTableテーブルに行を挿入します。そして、2つの入力引数(ストアド プロシージャ名と記録されるテキスト)を受け入れます。呼び出し側が他のどのストアド プロシージャでもこれを使うには、ストアド プロシージャでのEXECUTE PROCEDURE権限が必要です。
以下に示すストアド プロシージャはLogDatabase.spDebugを呼び出します。
CREATE PROCEDURE spRow (OUT pRowCount INTEGER) BEGIN DECLARE ErrorText CHAR(255) DEFAULT NULL: DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET ErrorText = ’In exception handler ...’ || ’SQLCODE: ’ || SQLCODE || ’ SQLSTATE: ’ || SQLSTATE; CALL LogDatabase.spDebug (’spRow’, ErrorText); END; SET pRowCount = 0 FOR vFor AS cName CURSOR FOR SELECT c1 as a, c2 * 10 as b FROM ValueTable DO SET pRowCount = pRowCount + 1; SET ErrorText = ’RowCount: ’ || pRowCount || ’Values: ’ || vFor.a || ’ ’ || vFor.b; CALL LogDatabase.spDebug (’spRow’, ErrorText); ... ... ... END FOR; END;