RETURN ステートメントは、処理を終了します。 次に何が起きるかは、RETURN ステートメントが発行されるプログラミングのコンテキストに応じて異なります。
Main 関数
ノード | RETURN TRUE; | RETURN FALSE; | RETURN UNKNOWN (BOOLEAN タイプの場合) または RETURN NULL; | RETURN; |
---|---|---|---|---|
Compute | メッセージを Out ターミナルに伝搬する | 伝搬を停止する | 伝搬を停止する | デプロイ失敗 (BIP2912E: RETURN のタイプが一致しません) |
Database | メッセージを Out ターミナルに伝搬する | 伝搬を停止する | 伝搬を停止する | デプロイ失敗 (BIP2912E: RETURN のタイプが一致しません) |
Filter | メッセージを True ターミナルに伝搬する | メッセージを False ターミナルに伝搬する | メッセージを Unknown ターミナルに伝搬する | デプロイ失敗 (BIP2912E: RETURN のタイプが一致しません) |
ユーザー定義関数およびプロシージャー
関数またはプロシージャーで使用する場合、RETURN ステートメントはその関数の処理を停止し、呼び出し元の式に制御を戻します。 expression (RETURNS 文節を使って関数またはプロシージャーが宣言されている場合は必ず存在しなければならない) は評価され、関数の戻り値となります。戻り値のデータ・タイプは、関数の宣言にあるものと同一でなければなりません。次の表は、ユーザー定義関数およびプロシージャーで RETURN ステートメントを使用する場合の違いを示しています。
RETURN expression; | RETURN NULL; (または NULL と評価される return expression) | RETURN; | RETURN ステートメントなし | |
---|---|---|---|---|
RETURNS 文節を持つユーザー定義関数またはプロシージャー | expression の値で呼び出し側の式に制御を戻す | NULL で呼び出し側の式に制御を戻す | デプロイ失敗 (BIP2912E: RETURN のタイプが一致しません) | 関数またはプロシージャーのすべてのステートメントが実行された後、NULL で呼び出し側の式に制御を戻す |
RETURNS 文節を持たないユーザー定義関数またはプロシージャー | デプロイ失敗 (BIP2401E: 構文エラー: ; が期待されていましたが、expression が見つかりました。) | デプロイ失敗 (BIP2401E: 構文エラー: ; が期待されていましたが、NULL が見つかりました。) | 呼び出し側の式に制御を戻す | 関数またはプロシージャーのすべてのステートメントが実行された後、呼び出し側の式に制御を戻す |
RETURN ステートメントは、必ず、宣言の中に RETURNS ステートメントが含まれている関数またはプロシージャーの本文で使用する必要があります。 この関数は、CALL ... INTO ステートメントを使用して呼び出すことができます。 RETURNS ステートメントは、関数やプロシージャーが CALL ステートメントに戻すデータ型を提供します。 CALL ... INTO ステートメントは、戻り値が割り当てられる変数を指定します。 このトピックの例では、RETURNS ステートメントと CALL ... INTO ステートメントを一緒に使用して RETURN ステートメントを割り当てる方法の例を示します。 RETURNS ステートメントが宣言されていない関数やプロシージャーを CALL ... INTO ステートメントを使用して呼び出すと、BIP2912E エラー・メッセージが生成されます。
CREATE FILTER MODULE ProcessOrder
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE SpecialOrder BOOLEAN;
SET OutputRoot.MQMD = InputRoot.MQMD;
CALL IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases) INTO SpecialOrder;
--
-- more processing could be inserted here
-- before routing the order to the appropriate terminal
--
RETURN SpecialOrder;
END;
CREATE FUNCTION IsBulkOrder (P1 REFERENCE)
RETURNS BOOLEAN
BEGIN
-- Declare and initialize variables--
DECLARE a INT 1;
DECLARE PriceTotal FLOAT 0.0;
DECLARE NumItems INT 0;
DECLARE iroot REFERENCE TO P1;
-- Calculate value of order, however if this is a bulk purchase, the --
-- order will need to be handled differently (discount given) so return TRUE --
-- or FALSE depending on the size of the order --
WHILE a <= CARDINALITY(iroot.Item[]) DO
SET NumItems = NumItems + iroot.Item[a].Quantity;
SET PriceTotal = PriceTotal + iroot.Item[a].UnitPrice;
SET a = a + 1;
END WHILE;
RETURN (PriceTotal/NumItems> 42);
END;
END MODULE;
この例では、品目の平均価格が 42 より大きいなら、TRUE が戻されます。それ以外の場合、FALSE が戻されます。
Filter ノードにおいて、高価な品目を記述するメッセージが、そうでない品目を記述するメッセージとは異なるパスに従うようにすることができます。
この例の CALL
IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases) INTO SpecialOrder; ステートメントは、SpecialOrder = IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases); のように書くこともできます。ノードで PROPAGATE ステートメントを使用している場合は、RETURN FALSE; を使用して、メッセージ・フローの次のノードに自動的にメッセージが伝搬されないようにすることは重要です。 Compute ノードでの処理の終了時に暗黙的な伝搬が行われないようにする例は、PROPAGATE ステートメントを参照してください。