ExceptionList ツリーには独自の相関名 ExceptionList があり、このツリーの内容を参照または設定するすべての ESQL ステートメントではこの名前を使用する必要があります。
入力メッセージが構文解析される際に、論理ツリーと共にこのツリーが作成されます。 最初は空になっていて、メッセージ・フロー処理中に例外が発生する場合にのみ移植されます。 複数の例外が生じる可能性もあります。その場合には、ExceptionList ツリーには、各例外のサブツリーが含まれます。
Compute、Database、および Filter ノードで ExceptionList ツリーにアクセスでき、Compute ノードでは更新することもできます。 適切な相関名を使用する必要があります。 Database ノードまたは Filter ノードに対しては例外リスト、Compute ノードに対しては InputExceptionList を使用します。
エラー処理プロシージャーにおいて、あるノードでこのツリーにアクセスしたい場合があるかもしれません。 例えば、例外のタイプに応じて異なるパスにメッセージの経路を定めたい場合もあります。 あるものは ESQL THROW ステートメントを使用して明示的に生成し、別のものはブローカーが生成するなどという例を挙げることができます。
次の ESQL は、ExceptionList にアクセスし、含まれるそれぞれの子を処理する方法を示しています。
-- Declare a reference for the ExceptionList -- (in a Compute node use InputExceptionList) DECLARE start REFERENCE TO ExceptionList.*[1]; -- Loop through the exception list children WHILE start.Number IS NOT NULL DO -- more ESQL -- Move start to the last child of the field to which it currently points MOVE start LASTCHILD; END WHILE;
下記の 2 番目の例は ESQL からの抽出です。 これは Compute ノード用にコーディングされ、最後の (ネストされた) 例外記述まで例外リストをループ走査し、エラー番号を抽出します。 このエラーは問題の根本原因に関係しており、ほとんどの場合に最も正確な情報を提供します。 この方法で取得したエラー番号に基づき、メッセージ・フローがこの後にどんなアクションを取るかを決定できます。
CREATE PROCEDURE getLastExceptionDetail(IN InputTree reference,OUT messageNumber integer, OUT messageText char) /**************************************************************************** * A procedure that will get the details of the last exception from a message * IN InputTree: The incoming exception list * IN messageNumber: The last message numberr. * IN messageText: The last message text. *****************************************************************************/ BEGIN -- Create a reference to the first child of the exception list declare ptrException reference to InputTree.*[1]; -- keep looping while the moves to the child of exception list work WHILE lastmove(ptrException) DO -- store the current values for the error number and text IF ptrException.Number is not null THEN SET messageNumber = ptrException.Number; SET messageText = ptrException.Text; END IF; -- now move to the last child which should be the next exceptionlist move ptrException lastchild; END WHILE; END;
ExceptionList の使用に関する詳細は、Error Handler サンプルのサブフローを参照してください。そのサブフローには、ExceptionList 構造に問い合わせてその内容に応じて特定のアクションを実行する ESQL が組み込まれています。