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: 42821
sqlerrd(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 を作成しています。 これにより、parm1parm2 で除算した結果の値を表に挿入します。 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 = 0
TYPE パラメーターの値が 'P' であることは、このオブジェクトがプロシージャーであることを示しています。 オブジェクトはモジュールに属していないため、MODULE パラメーターは NULL です。
注: SQLCA 構造体には、インライン SQL PL オブジェクトの実行中に発生するエラーの行番号情報が含まれていません。