Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerOracle では、ユーザー定義型 (UDT) と呼ばれるカスタムデータ型を作成できます。次の例は、Oracle データベースの UDT を使用するストアドプロシージャーをコールする、データベース用 Anypoint Connector (Database Connector) の Stored procedure 操作を Mule アプリケーション内で設定する方法を示しています。
このストアドプロシージャーでは次の 2 つのアクションを実行します。
100 歳未満の個人の名、姓、年齢、電話番号をテーブルに挿入する
テーブルに追加されているすべての個人の電話番号のリストを返す
この例を実行するには、次の操作が必要です。
UDT、テーブル、およびストアドプロシージャーを作成するスクリプトを実行する
Oracle データベース接続を設定する
Mule アプリケーションを作成する
createStruct
および createArray
DataWeave 関数を使用してアプリケーションデータをカスタム型にマップする
アプリケーションを実行し、curl コマンドを使用してアプリケーションをテストする
次のスクリーンショットは、この例の Anypoint Studio アプリケーションフローを示しています。
Oracle データベース接続を設定して Mule アプリケーションを作成する前に、任意の SQL クライアントツールを使用して、データベースに次の UDT を作成する .sql
スクリプトを実行します。
PEOPLE
PERSON
PHONE_NUMBER
PHONE_NUMBER_ARRAY
PHONE_BOOK
一部の UDT には別の UDT が含まれるため、UDT を定義する順序が重要になります。たとえば、オブジェクト型 PERSON
は、そのメンバーの PHONE_NUMBER_ARRAY
を定義する前に定義する必要があります。
このスクリプトでは、HUMANS
というテーブルと、PROC_INSERT_HUMANS
というストアドプロシージャーも作成されます。このストアドプロシージャーの目的は、入力パラメーターとして型 PEOPLE
のオブジェクトを受け取って、そのオブジェクトから 100 歳未満の個人を取得してテーブル HUMANS
に挿入することです。また、このストアドプロシージャーでは、HUMANS
テーブルにすでに挿入されているすべての個人の電話番号のリストで構成される型 PHONE_BOOK
の出力パラメーターも定義されています。
この UDT、テーブル、およびストアドプロシージャーを作成するために実行するスクリプトは次のとおりです。
--CREATE CUSTOM DATA TYPES (UDTs)
CREATE OR REPLACE TYPE PHONE_NUMBER AS object(areaCode VARCHAR2(10), phoneNumber VARCHAR2(20));
CREATE OR REPLACE TYPE PHONE_NUMBER_ARRAY AS VARRAY(10) OF PHONE_NUMBER;
CREATE OR REPLACE TYPE PERSON IS OBJECT(firstName VARCHAR(50), surname VARCHAR(50), age NUMBER, phoneNumbers PHONE_NUMBER_ARRAY);
CREATE OR REPLACE TYPE PEOPLE IS TABLE OF PERSON;
CREATE OR REPLACE TYPE PHONE_BOOK AS VARRAY(10) OF VARCHAR2(200);
--CREATE TABLE HUMANS;
CREATE TABLE HUMANS(
firstName VARCHAR(50),
surname VARCHAR(50),
age NUMBER,
phoneNumbers PHONE_NUMBER_ARRAY
);
--CREATE STORED PROCEDURE
create or replace procedure PROC_INSERT_HUMANS(people IN PEOPLE, contactList OUT PHONE_BOOK) IS
phoneBook PHONE_BOOK := PHONE_BOOK();
BEGIN
FOR idx IN people.first .. people.last LOOP
IF people(idx).age < 100 THEN
INSERT INTO HUMANS(firstName, surname, age, phoneNumbers)
VALUES(people(idx).firstName, people(idx).surname, people(idx).age, people(idx).phoneNumbers);
END IF;
END LOOP;
FOR humanContact IN (SELECT * FROM HUMANS h, TABLE(h.phoneNumbers) n) LOOP
phoneBook.EXTEND(1);
phoneBook(phoneBook.COUNT) := humanContact.surname || ',' || humanContact.firstname || ':' || humanContact.areaCode ||'-'|| humanContact.phoneNumber;
END LOOP;
contactList := phonebook;
COMMIT;
END PROC_INSERT_HUMANS;
Oracle データベース内で UDT、テーブル、ストアドプロシージャーを作成したら、Anypoint Studio に移動して Oracle データベース接続を設定します。
Studio で新しい Mule プロジェクトを作成します。
[Global Elements (グローバル要素)] ビューに移動します。
[Create (作成)] をクリックして、[Choose Global Type (グローバル種別の選択)] ビューを開きます。
[Filter (検索条件)] 項目に「http
」と入力し、[HTTP Listener config (HTTP リスナー設定)] を選択して [OK] をクリックします。
この設定は、Mule アプリケーションフローを開始する HTTP Listener ソース用です。
[HTTP Listener config (HTTP リスナー設定)] ウィンドウで、次のパラメーターを設定します。
Protocol (プロトコル)
HTTP (デフォルト)
Host (ホスト)
All Interfaces [0.0.0.0] (default)
Port (ポート)
8081
[OK] をクリックします。
[Global Elements (グローバル要素)] ビューで [Create (作成)] をクリックして [Choose Global Type (グローバル種別の選択)] ビューを開きます。
[Filter (検索条件)] 項目に「database
」と入力し、[Database Config (データベース設定)] を選択して [OK] をクリックします。
[Database Config (データベース設定)] ウィンドウで [Name (名前)] 項目を dbConfig
に設定します。
[Connection (接続)] 項目で [Oracle Connection (Oracle 接続)] を選択します。
[Configure (設定)] をクリックし、必要な Oracle JDBC ドライバーを追加して、次のいずれかを選択します。
Use local file (ローカルファイルを使用)
ローカルファイルを使用してライブラリをインストールします。
Add Maven dependency (Maven 連動関係を追加)
Maven 連動関係をインストールしてプロジェクトに追加します。
[Connection (接続)] セクションで、次のパラメーターを設定します。
Host (ホスト)
localhost
Port (ポート)
1521
User (ユーザー)
SYS as SYSDBA
Password (パスワード)
Oradoc_db1
Instance (インスタンス)
ORCLCDB
[Advanced (詳細)] タブで [Column types (列の型)] 項目を [Edit inline (インライン編集)] に設定します。
プラス記号 (+) をクリックして、新しい列の型を追加し、すでに作成されているすべての UDT をリストします。
次の値を [Id] および [Type name (型名)] 項目に指定します。
Id | 型名 |
---|---|
2003 |
|
2003 |
|
2008 |
|
2003 |
|
2003 |
|
[Finish (完了)] をクリックして、[Column Type (列の型)] ウィンドウを閉じます。
[Test Connection (接続をテスト)] をクリックして、Mule がデータベースに接続できることを確認します。
[OK] をクリックします。
次のスクリーンショットは、Studio での HTTP リスナーのグローバル要素設定を示しています。
次のスクリーンショットは、Studio でのデータベースのグローバル要素設定を示しています。
Oracle データベース接続を設定したら、Mule アプリケーションを作成、実行、およびテストして、ストアドプロシージャーをコールします。
Mule フローを作成する手順は、次のとおりです。
[Mule Palette (Mule パレット)] ビューで、[HTTP] の [Listener] ソースを選択してキャンバスにドラッグします。
このソースは受信 HTTP メッセージ属性をリスンすることでフローを開始します。
[Connector configuration (コネクタ設定)] 項目で HTTP_Listener_config
グローバル設定を選択します。
[Path (パス)] 項目を /oracle
に設定します。
[Set Payload] コンポーネントを [Listener] の右にドラッグします。
このコンポーネントでは、処理のためにストアドプロシージャーに送信する項目のリストを作成します。
[Value (値)] 項目で、リストする項目を指定します。
[{'name':'Anthony J', 'surname':'Crowley', 'age': 6000, 'phoneNumber': {'areaCode':'020', 'phoneNumber': '777'}},
{'name':'A.Z', 'surname':'Fell', 'age': 6000, 'phoneNumber':{'areaCode':'020', 'phoneNumber': '888'}},
{'name':'Adam', 'surname':'Young', 'age': 11, 'phoneNumber':{'areaCode':'046', 'phoneNumber': '666'}},
{'name':'Anathema', 'surname':'Device', 'age': 27, 'phoneNumber':{'areaCode':'020', 'phoneNumber': '123'}},
]
[Mime Type (MIME タイプ)] 項目を application/java
に設定します。
Transform Message コンポーネントと、アプリケーションデータをカスタムユーザーデータ型の例にマップする createStruct
および createArray
DataWeave 関数を使用して、Mule アプリケーションの作成を継続します。
[Transform Message] コンポーネントを [Set Payload] の右にドラッグします。
このコンポーネントでは、ストアドプロシージャーで入力パラメーターとして想定されているデータ型 PEOPLE
にマップできるオブジェクトに JSON オブジェクトが変換されます。
Studio キャンバスでコンポーネントをダブルクリックして、名前を Transform Message - Prepare UDT
に設定します。
コンポーネントの [Output (出力)] ソースコードビューで [Edit Current Target (現在の対象を編集)] ボタンをクリックします。
[Selection dialog (選択ダイアログ)] ボックスで [Output (出力)] 項目を Variable
、[Variable name (変数名)] を in_people_tab
に設定し、[OK] をクリックします。
[Output (出力)] 項目で、createStruct
および createArray
関数が含まれる次の DataWeave 式を指定します。
%dw 2.0
output application/java
fun toPhoneNumberArray(phoneNumber) = Db::createArray("dbConfig", "PHONE_NUMBER_ARRAY",[Db::createStruct("dbConfig", "PHONE_NUMBER", [phoneNumber.areaCode, phoneNumber.phoneNumber])])
fun toPerson(person) = Db::createStruct("dbConfig", "PERSON", [person.name, person.surname, person.age, toPhoneNumberArray(person.phoneNumber)])
---
Db::createArray("dbConfig", "PEOPLE", payload map (item, index) -> ( toPerson(item) ) )
createStruct
関数では、Name
型および対応するプロパティに基づいて JDBC 構造オブジェクトが作成されます。この例では、型 PERSON
と PHONE_NUMBER
が構造オブジェクトです。この関数では、次のパラメーターがこの順序で想定されます。
configName
Struct
型を作成する設定の名前を含む文字列 (この例では dbConfig
)
typeName
作成する Struct
型の名前を含む文字列 (この例では PERSON
または PHONE_NUMBER
)
values
Struct
プロパティに準拠する値の配列 (この例では PHONE_NUMBER
、['046', '666']
)
createArray
関数では、Array
型に基づいて JDBC 配列オブジェクトが作成されます。この例では、型 PHONE_NUMBER_ARRAY
、PEOPLE
、および PHONE_BOOK
が配列オブジェクトです。この関数では、次のパラメーターがこの順序で想定されます。
configName
Array
型を作成する設定の名前を含む文字列 (この例では dbConfig
)
typeName
作成する Array
型の名前を含む文字列 (この例では PEOPLE
または PHONE_NUMBER_ARRAY
)
values
Array
型に準拠する値の配列 (この例では createStruct
関数を使用して作成された PERSON
オブジェクトの配列)
これらの関数を組み合わせて使用して、サブタイプまたはネストされた型を作成できます。この例では、型 PERSON
に PHONE_NUMBER_ARRAY
オブジェクトが含まれます。同時に型 PHONE_NUMBER_ARRAY
が PHONE_NUMBER
の配列として定義されます。
また、Array
型に基づいて UDT に一致させるときに createArray
関数を使用する場合、複合型に合わせてこれらの関数を組み合わせることができます。
Database Connector の Stored Procedure 操作を使用して、UDT を使用する Oracle ストアドプロシージャーをコールします。
[Stored procedure] 操作を [Transform Message] の右にドラッグします。
この操作では、Database Connector を使用してストアドプロシージャーがコールされます。
[Connector configuration (コネクタ設定)] 項目で dbConfig
グローバル設定を選択します。
[SQL Query Text (SQL クエリテキスト)] 項目に「{ call proc_insert_humans(:people, :phoneBook) }
」と入力します。
[Input Parameters (入力パラメーター)] 項目に「{ people: vars.in_people_tab}
」と入力します
このステップでは、in_people_tab
という変数に保存された変換の出力が入力パラメーターにマップされます。
[Output Parameters (出力パラメーター)] 項目で Edit inline
を選択し、プラス記号 (+) をクリックしてカスタムパラメーターを設定します。
Key (キー)
phoneBook
Custom Type (カスタム型)
PHONE_BOOK
2 つ目の [Transform Message] コンポーネントを [Stored Procedure] の右にドラッグします。
Studio キャンバスでコンポーネントをダブルクリックして、名前を Transform Message - response to JSON
に設定します。
コンポーネントの [Output (出力)] ソースコードビューで、次の DataWeave 式を設定します。
%dw 2.0
output application/json
---
payload
この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディターに貼り付けます。
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http"
xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd">
<http:listener-config name="HTTP_Listener_config" >
<http:listener-connection host="0.0.0.0" port="8081" />
</http:listener-config>
<db:config name="dbConfig" >
<db:oracle-connection host="localhost" user="SYS as SYSDBA" password="Oradoc_db1" instance="ORCLCDB">
<db:column-types>
<db:column-type id="2003" typeName="PEOPLE"/>
<db:column-type id="2003" typeName="PHONE_NUMBER"/>
<db:column-type id="2008" typeName="PERSON" />
<db:column-type id="2003" typeName="PHONE_NUMBER_ARRAY"/>
<db:column-type id="2003" typeName="PHONE_BOOK"/>
</db:column-types>
</db:oracle-connection>
</db:config>
<flow name="oracle-udtsFlow" >
<http:listener config-ref="HTTP_Listener_config" path="/oracle"/>
<set-payload value="#[[{'name':'Anthony J', 'surname':'Crowley', 'age': 6000, 'phoneNumber': {'areaCode':'020', 'phoneNumber': '777'}},
{'name':'A.Z', 'surname':'Fell', 'age': 6000, 'phoneNumber':{'areaCode':'020', 'phoneNumber': '888'}},
{'name':'Adam', 'surname':'Young', 'age': 11, 'phoneNumber':{'areaCode':'046', 'phoneNumber': '666'}},
{'name':'Anathema', 'surname':'Device', 'age': 27, 'phoneNumber':{'areaCode':'020', 'phoneNumber': '123'}},
]]" mimeType="application/java"/>
<ee:transform doc:name="Transform Message - Prepare UDT">
<ee:variables>
<ee:set-variable variableName="in_people_tab"><![CDATA[%dw 2.0
output application/java
fun toPhoneNumberArray(phoneNumber) = Db::createArray("dbConfig", "PHONE_NUMBER_ARRAY",[Db::createStruct("dbConfig", "PHONE_NUMBER", [phoneNumber.areaCode, phoneNumber.phoneNumber])])
fun toPerson(person) = Db::createStruct("dbConfig", "PERSON", [person.name, person.surname, person.age, toPhoneNumberArray(person.phoneNumber)])
---
Db::createArray("dbConfig", "PEOPLE", payload map (item, index) -> ( toPerson(item) ) )
]]></ee:set-variable>
</ee:variables>
</ee:transform>
<db:stored-procedure config-ref="dbConfig">
<db:sql><![CDATA[{ call proc_insert_humans(:people, :phoneBook) }]]></db:sql>
<db:input-parameters><![CDATA[{
people: vars.in_people_tab
}]]></db:input-parameters>
<db:output-parameters >
<db:output-parameter key="phoneBook" customType="PHONE_BOOK" />
</db:output-parameters>
</db:stored-procedure>
<ee:transform doc:name="Transform Message - response to JSON" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
</ee:message>
</ee:transform>
</flow>
</mule>