SQLCA 構造体でのエラーのロケーション
SQL PL オブジェクトのコンパイルまたは実行中にエラーが発生した場合、Db2® データベース・マネージャーから返される SQLCA 構造体に、エラーの発生元を識別するのに役立つ情報が含まれています。
コンパイル時エラー
SQL PL オブジェクト (インラインまたはコンパイル済み) のコンパイル時にエラーが発生した場合、返される SQLCA 構造体の sqlerrd(3) フィールドに、Db2 SQL コンパイラーから報告されたエラーの行番号が含まれています。以下の例では、プロシージャー myproc の行 5 に無効なステートメントが含まれています。
このステートメントが無効なのは、SET ステートメントのソース部分とターゲット部分のデータ・タイプが一致していないためです。
create procedure myproc (parm1 integer)
begin
declare var1 date;
set var1 = parm1;
end @このプロシージャーがファイル script1.db2 に格納されているとします。
コマンド・ライン・プロセッサー (CLP) を使用して、以下のコマンドによりこのファイルの処理を試みます。
db2 -td@ -a -f script1.db2-a オプションを使用することにより、CLP で SQLCA が表示されます。
結果は、以下のような情報になります。
SQLCA Information
sqlcaid : SQLCA sqlcabc: 136 sqlcode: -408
sqlerrml: 4
sqlerrmc: VAR1
sqlerrd : (1) 0 (2) 0 (3) 5
(4) 0 (5) 0 (6) 0
...
sqlstate: 42821sqlerrd(3) フィールドの値が 5 であることは、CREATE PROCEDURE ステートメントの行 5 にエラーがあったことを示しています。
この例では、クライアント・インターフェースとして CLP を使用していますが、それは、CLP がステートメントの実行結果の SQLCA 構造体を表示するための手軽な手段であるからです。
しかし、CLP を使用して SQL PL ステートメントをコンパイルする場合、エラーの行番号を特定するのに SQLCA 構造体を表示する必要はありません。
CLP は、エラー・メッセージを書式設定する際に自動的に行番号を表示します。
作成されるプロシージャー (myproc) に関して、-a オプションを指定しないで CLP を呼び出したとすると、以下のメッセージが返され、エラーが行 5 にあったことが示されます。
SQL0408N A value is not compatible with the data type of its assignment
target. Target name is "VAR1". LINE NUMBER=5. SQLSTATE=42821実行時エラー
コンパイル済み SQL PL ルーチンまたはトリガーの実行時にエラーが発生した場合、Db2 データベース・マネージャーから返される SQLCA 構造体には、エラーの原因となったステートメントの行番号と共に、そのステートメントが含まれる SQL PL ルーチンまたはトリガーを固有に識別する数値が含まれています。以下の例のステートメントでは、1 つの整数列を含む表 table1 を作成しています。
第 2 のステートメントでは、2 つの整数パラメーター parm1 および parm2 を伴うプロシージャー appdev.proc2 を作成しています。
これにより、parm1 を parm2 で除算した結果の値を表に挿入します。
1 と 0 を引数とする CALL ステートメントを実行すると、ゼロ除算の実行時エラーになります。
create table table1 (col1 integer) @
create procedure appdev.proc2(in parm1 integer, parm2 integer)
specific appdev_proc2
begin
insert into table1 (parm1 / parm2);
end @
call proc2(1, 0) @これらのステートメントがファイル script2.db2. に格納されているとします。
CLP を使用して、以下のコマンドによりこのファイルの処理を試みます。
db2 -td@ -a -f script2.db2呼び出し実行後、CLP による出力結果は以下のようになります。
SQLCA Information
sqlcaid : SQLCAM sqlcabc: 136 sqlcode: -801
...
sqlerrd : (1) 0 (2) 0 (3) 4
(4) 13152254 (5) 0 (6) 0
...
sqlstate: 22012結果に含まれる sqlcode -801 という値は、ゼロによる除算 (SQLSTATE 22012) に対応します。
コンパイル時エラーと同じように、sqlerrd(3) フィールドの値は、エラーの発生元となった SQL PL オブジェクト内の行番号を示しています (この場合は行番号 4)。
さらに、sqlerrd(4) フィールドの値は、その SQL PL オブジェクトを固有に識別する整数値です。
この固有 ID は、SYSPROC.GET_ROUTINE_NAME プロシージャーを使用することにより、エラーの発生したオブジェクトの名前にマップできます。
このプロシージャーは、sqlerrd(4) フィールドの値を入力パラメーターとし、5 個の出力パラメーターに情報を返します。
以下の例を参照してください。
db2 CALL SYSPROC.GET_ROUTINE_NAME(13152254, ?, ?, ?, ?, ?)
Value of output parameters
--------------------------
Parameter Name : TYPE
Parameter Value : P
Parameter Name : SCHEMA
Parameter Value : APPDEV
Parameter Name : MODULE
Parameter Value : -
Parameter Name : NAME
Parameter Value : PROC2
Parameter Name : SPECIFIC_NAME
Parameter Value : APPDEV_PROC2
Return Status = 0TYPE パラメーターの値が 'P' であることは、このオブジェクトがプロシージャーであることを示しています。
オブジェクトはモジュールに属していないため、MODULE パラメーターは NULL です。
注: SQLCA 構造体には、インライン SQL PL オブジェクトの実行中に発生するエラーの行番号情報が含まれていません。