ストアドプロシージャーの入力および出力パラメーターの設定

データベース用 Anypoint Connector (Database Connector) の ​Stored procedure​ 操作の入力または出力パラメーターを設定して、ストアドプロシージャーで使用するパラメーターを指定します。入力パラメーター (プロシージャーに渡される値)、出力パラメーター (プロシージャーから返される値)、または入出力パラメーター (両方の組み合わせ) があります。

Anypoint Studio では、次の項目を使用して ​Stored procedure​ 操作のパラメーターを設定できます。

  • Input parameters (入力パラメーター)

    ストアドプロシージャーへの入力として指定される値のパラメーター。

    通常、これらのパラメーターを介して Mule アプリケーションからストアドプロシージャーに値を渡します。

  • Output parameters (出力パラメーター)

    ストアドプロシージャーから Mule アプリケーションに値を返すために使用されるパラメーター。

    ストアドプロシージャーを実行したら、これらのパラメーターに割り当てられた値を取得できます。

  • In out parameters (入出力パラメーター)

    入力と出力の両方のパラメーターとして機能するパラメーター。

    これらのパラメーターを介してストアドプロシージャーに値を渡すことができます。

入力パラメーターを設定する

顧客の注文を管理するための Mule アプリケーションを開発するシナリオを考えます。このケースでは、顧客 ID や注文状況などのパラメーターを取るストアドプロシージャーを使用してデータベースから注文情報を取得します。

次の例は、​Stored procedure​ 操作の ​[Input parameters (入力パラメーター)]​ 項目を設定して、特定の条件に基づいて注文の詳細を動的に取得する方法を示しています。

  1. Studio で、​[Database Configuration (データベース設定)]​ 要素を Mule アプリケーションプロジェクトに追加し、必要な MySQL データベース接続の詳細を使用して設定します。

  2. 注文情報を取得するために、​Stored procedure​ 操作をキャンバスにドラッグします。

  3. フローから操作を選択します。

  4. [SQL Query text (SQL クエリテキスト)]​ 項目に​「{call GetOrderDetails(:customerId, :orderStatus)}」​と入力します。

    これにより、名前付きパラメーター ​customerId​ および ​orderStatus​ を使用してストアドプロシージャー ​GetOrderDetails​ をコールするための SQL ステートメントが定義されます。

  5. [Input parameters (入力パラメーター)]​ 項目に、注文の詳細を取得する次の式を入力します。

    {
            "name": "customerId",
            "type": "INTEGER",
            "value": #[flowVars.customerId]
        },
        {
            "name": "orderStatus",
            "type": "VARCHAR",
            "value": #[message.inboundProperties['orderStatus']]
        }
    • name

      入力パラメーターの名前。

    • type

      入力パラメーターのデータ型。

    • value

      Mule 式構文を使用して指定される入力パラメーターの値。

設定 XML​ エディターでは、設定は次のように記述されます。

<db:stored-procedure config-ref="Database_Config" doc:name="Stored Procedure">
    <db:sql>
        <![CDATA[{call GetOrderDetails(:customerId, :orderStatus)}]]>
    </db:sql>
    <db:input-parameters>
        <![CDATA[#[{
            "name": "customerId",
            "type": "INTEGER",
            "value": #[flowVars.customerId]
        },
        {
            "name": "orderStatus",
            "type": "VARCHAR",
            "value": #[message.inboundProperties['orderStatus']]
        }]]]>
    </db:input-parameters>
</db:stored-procedure>

出力パラメーターを設定する

オンライン販売システムの Mule アプリケーションを開発するシナリオを考えます。Mule アプリケーションで注文処理を管理しますが、ストアドプロシージャーを使用し、MySQL データベースから注文の詳細を取得して注文の総額を計算する機能を実装したいと考えています。このシナリオでは、ストアドプロシージャーは注文品目、数量、総額などの詳細を出力パラメーターとして返します。

次の例は、​Stored procedure​ 操作の ​[Output parameters (出力パラメーター)]​ 項目を設定して、注文の詳細と総額を動的に取得する方法を示しています。

  1. Studio で、​[Database Configuration (データベース設定)]​ 要素を MuleSoft アプリケーションプロジェクトに追加し、必要な MySQL データベース接続の詳細を使用して設定します。

  2. 注文情報を取得するために、​Stored procedure​ 操作をキャンバスにドラッグします。

  3. フローから操作を選択します。

  4. [SQL Query text (SQL クエリテキスト)]​ 項目に​「{call GetOrderDetails(:orderId, :totalAmount, :orderDetails)}」​と入力します。

    これにより、ストアドプロシージャー ​GetOrderDetails​ をコールして、​orderId​、​totalAmount​、​orderDetails​ などの出力パラメーターを取得するための SQL ステートメントが定義されます。

  5. [Output parameters (出力パラメーター)]​ を ​[Edit inline (インライン編集)]​ に設定します。

  6. プラスアイコンをクリックして [Output parameter (出力パラメーター)] ウィンドウを開きます。

  7. [Output parameter (出力パラメーター)]​ ウィンドウで、次のパラメーターを設定します。

    キー キー値

    orderId

    INTEGER

    totalAmount

    Decimal (10 進数)

    orderDetails

    ARRAY

  8. [Finish (完了)]​ をクリックします。

設定 XML​ エディターでは、設定は次のように記述されます。

<db:stored-procedure config-ref="MySQL_Configuration" doc:name="Stored Procedure">
    <db:sql><![CDATA[{call GetOrderDetails(:orderId, :totalAmount, :orderDetails)}]]></db:sql>
    <db:output-parameters>
        <![CDATA[#[{
            "name": "orderId",
            "type": "INTEGER"
        },
        {
            "name": "totalAmount",
            "type": "DECIMAL"
        },
        {
            "name": "orderDetails",
            "type": "ARRAY"
        }]]]>
    </db:output-parameters>
</db:stored-procedure>

入出力パラメーターを設定する

特定の商品の在庫レベルの更新プロセスを処理する庫管理システムの Mule アプリケーションを開発するシナリオを考えます。このシナリオでは、Mule アプリケーションは PostgreSQL データベースの ​UpdateStockLevel​ という名前のストアドプロシージャーとやりとりします。このやりとりには、入力と出力の両方のパラメーターが必要です。

次の例は、​Stored procedure​ 操作の ​[In out parameters (入出力パラメーター)]​ 項目を設定して、在庫レベルの更新を管理する方法を示しています。これには、入力データ (商品 ID と数量) と出力データ (更新された在庫レベル) の両方が含まれます。

  1. Studio で、​[Database Configuration (データベース設定)]​ 要素を MuleSoft アプリケーションプロジェクトに追加し、必要な PostgreSQL データベース接続の詳細を使用して設定します。

  2. 注文情報を取得するために、​Stored procedure​ 操作をキャンバスにドラッグします。

  3. フローから操作を選択します。

  4. [SQL Query text (SQL クエリテキスト)]​ 項目に​「{call UpdateStockLevel(:productId, :quantity, :updatedStockLevel)}」​と入力します。

    これにより、​productId​ および ​quantity​ 入力パラメーターと ​updatedStockLevel​ 出力パラメーターを使用して ​UpdateStockLevel​ という名前のストアドプロシージャーをコールする SQL ステートメントが作成されます。

  5. [In out parameters (入出力パラメーター)]​ を ​[Edit inline (インライン編集)]​ に設定します。

  6. プラスアイコンをクリックして ​[In out parameter (入出力パラメーター)]​ ウィンドウを開きます。

  7. [In out parameter (入出力パラメーター)]​ ウィンドウで、次のパラメーターに値を割り当てます。

    キー

    productId

    #[payload.productId]

    quantity

    #[payload.quantity]

    updatedStockLevel

    (空)

  8. [Finish (完了)]​ をクリックします。

設定 XML​ エディターでは、設定は次のように記述されます。

<db:stored-procedure doc:name="Stored procedure"
<db:sql ><db:in-out-parameters >
			</db:in-out-parameters><![CDATA[{call UpdateStockLevel(:productId, :quantity, :updatedStockLevel)}]]>
			</db:sql>
			<db:in-out-parameters >
				<db:in-out-parameter key="updatedStockLevel" />
				<db:in-out-parameter key="productId" value="#[payload.productId]" />
				<db:in-out-parameter key="quantity" value="#[payload.quantity]" />
			</db:in-out-parameters>

カスタム型を設定する

ストアドプロシージャーのパラメーターとしてカスタム型を使用する機能は、使用しているデータベースシステムや、使用している Database Connector またはフレームワークの機能によって異なります。 カスタムデータベース型の ​Stored procedure​ 操作を使用して Oracle データベースベンダーと連携するときは注意してください。

+ パッケージ内でストアドプロシージャーを定義する場合、コネクタ接続設定でカスタム型パラメーターの列の型を設定します。

  1. Studio で ​[Database Config Global Element Properties (データベース設定グローバル要素プロパティ)]​ ウィンドウを開きます。

  2. [Advanced (詳細)]​ タブをクリックします。

  3. [Column types (列の型)]​ を ​[Edit inline (インライン編集)]​ に設定します。

  4. プラス記号をクリックして ​[Column types(列の型)]​ ウィンドウを開きます。

  5. [Column types (列の型)]​ ウィンドウで、目的の値で ​[Id]​ および ​[Type name (型名)]​ 項目を設定します。

  6. [OK]​ をクリックします。

「Column type (列の型)」 設定ウィンドウ

設定 XML​ エディターウィンドウでは、設定は次のように記述されます。

<db:column-types >
<db:column-type id="2003" typeName="MY_CUSTOM_PKG.MY_CUSTOM_TYPE" />
</db:column-types>

ストアドプロシージャーがパッケージに含まれていない場合でも、カスタム型パラメーターの ​[Column types (列の型)]​ を定義することをお勧めします。

設定の考慮事項

入出力パラメーター​を設定するときは、次の考慮事項を確認してください。

ストアドプロシージャーの変数値

次の考慮事項は、すべてのデータベースベンダーに適用されます。Mule Runtime Engine (Mule) では、特定の値セットが含まれる変数を​入出力パラメーター​としてストアドプロシージャーに渡す場合、操作の完了後に変更された値を変数に含めることはできません。代わりに、変更された値は操作のペイロードに含まれます。

この動作を説明するために、次のシナリオを考えます。

入出力パラメーター​として登録されているパラメーターに、​foo​ という名前の変数に保存されている値があります。​vars.foo​ がストアドプロシージャー ​vars.foo​ に渡されると、操作が呼び出された後にその元の値が返されます。ストアドプロシージャーをチェーニングすると、ストアドプロシージャー ​A​ をコールしたときに ​vars.foo​ の値が変更され、その後、すでに変更された値を使用してストアドプロシージャー ​B​ をコールできると思うかもしれませんが、

変更されたデータは操作の実行後のペイロードのエントリとして返されます。ペイロードには、ストアドプロシージャーで作成できる変更された値が含まれます。そのため、ストアドプロシージャーをチェーニングするには、操作ごとに 1 つのストアドプロシージャーのみを呼び出す必要があります。

Stored procedure​ 操作のデータを適切に書式設定するには、​prepareArray​ および ​prepareStruct​ 関数​を使用します。

返される値のデータ形式

Stored procedure​ 操作では、想定と異なる形式でデータが返されます。この制限は、すべてのデータベースベンダーに適用されます。

この動作を説明するために、次のシナリオを考えます。

Stored procedure​ 操作の入力として SQL 配列または SQL 構造が想定されますが (​prepareArray​ および ​prepareStruct​ 関数を使用して正しく解決される)、Mule で操作を実行すると、変更された値が含まれる Java オブジェクトが返されます。その結果、操作で想定と異なる形式のデータが返されます。これは、ストアドプロシージャーをチェーニングするときに問題になる可能性があります。

Stored procedure​ 操作のデータを適切に書式設定するには、​prepareArray​ および ​prepareStruct​ 関数​を使用します。