---
schema_version: "1"
id: d93e12d551e87a3de31f13abc51901c350471a9046824d376197a677ebf16db4
title: ユーザー定義型 (UDT) を使用する Oracle ストアドプロシージャーのコールの例
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/db-connector/1.10/database-connector-udt-stored-procedure.md
canonical_url: https://docs.mulesoft.com/jp/db-connector/1.10/database-connector-udt-stored-procedure
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 894de1bdf870106f65d0492168fb309f6af0a2601f7695cfd65e0dc97b0a61ea
description: MuleSoft Documentation Site
release: "1.10"
latest: false
---
# ユーザー定義型 (UDT) を使用する Oracle ストアドプロシージャーのコールの例

Oracle では、​_ユーザー定義型 (UDT)_​ と呼ばれるカスタムデータ型を作成できます。次の例は、Oracle データベースの UDT を使用するストアドプロシージャーをコールする、データベース用 Anypoint Connector (Database Connector) の ​**Stored procedure**​ 操作を Mule アプリケーション内で設定する方法を示しています。  
このストアドプロシージャーでは次の 2 つのアクションを実行します。  

- 100 歳未満の個人の名、姓、年齢、電話番号をテーブルに挿入する
- テーブルに追加されているすべての個人の電話番号のリストを返す

この例を実行するには、次の操作が必要です。  

- UDT、テーブル、およびストアドプロシージャーを作成するスクリプトを実行する
- Oracle データベース接続を設定する
- Mule アプリケーションを作成する
- `createStruct`​ および ​`createArray`​ DataWeave 関数を使用してアプリケーションデータをカスタム型にマップする
- アプリケーションを実行し、curl コマンドを使用してアプリケーションをテストする

![Studio での Oracle UDT のフロー](/mulesoft/current/ja-jp/db-connector/1.10/_images/database-oracle-udt-flow.png)

Figure 1. UDT を使用する Oracle ストアドプロシージャーのフロー

## [](#udtテーブルおよびストアドプロシージャーの作成)UDT、テーブル、およびストアドプロシージャーの作成

Oracle データベース接続を設定して Mule アプリケーションを作成する前に、任意の SQL クライアントツールを使用して、データベースに次の UDT を作成する ​`.sql`​ スクリプトを実行します。

1. `PEOPLE`
2. `PERSON`
3. `PHONE_NUMBER`
4. `PHONE_NUMBER_ARRAY`
5. `PHONE_BOOK`

一部の UDT には別の UDT が含まれるため、UDT を定義する順序が重要になります。たとえば、オブジェクト型 ​`PERSON`​ は、そのメンバーの ​`PHONE_NUMBER_ARRAY`​ を定義する前に定義する必要があります。

このスクリプトでは、​`HUMANS`​ というテーブルと、​`PROC_INSERT_HUMANS`​ というストアドプロシージャーも作成されます。このストアドプロシージャーの目的は、入力パラメーターとして型 ​`PEOPLE`​ のオブジェクトを受け取って、そのオブジェクトから 100 歳未満の個人を取得してテーブル ​`HUMANS`​ に挿入することです。また、このストアドプロシージャーでは、​`HUMANS`​ テーブルにすでに挿入されているすべての個人の電話番号のリストで構成される型 ​`PHONE_BOOK`​ の出力パラメーターも定義されています。

この UDT、テーブル、およびストアドプロシージャーを作成するために実行するスクリプトは次のとおりです。

```xml
--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-データベース接続の設定)Oracle データベース接続の設定

Oracle データベース内で UDT、テーブル、ストアドプロシージャーを作成したら、Anypoint Studio に移動して Oracle データベース接続を設定します。

1. Studio で新しい Mule プロジェクトを作成します。
2. **\[Global Elements (グローバル要素)\]**​ ビューに移動します。
3. **\[Create (作成)\]**​ をクリックして、​**\[Choose Global Type (グローバル種別の選択)\]**​ ビューを開きます。
4. **\[Filter (検索条件)\]**​ 項目に「​`http`​」と入力し、​**\[HTTP Listener config (HTTP リスナー設定)\]**​ を選択して ​**\[OK\]**​ をクリックします。  
    この設定は、Mule アプリケーションフローを開始する HTTP ​**Listener**​ ソース用です。
5. **\[HTTP Listener config (HTTP リスナー設定)\]**​ ウィンドウで、次のパラメーターを設定します。
    
    - **Protocol (プロトコル)**​: `HTTP (Default)`
    - **Host (ホスト)**​: `All Interfaces [0.0.0.0] (default)`
    - **Port (ポート)**​: `8081`

1. **\[OK\]**​ をクリックします。
2. **\[Global Elements (グローバル要素)\]**​ ビューで ​**\[Create (作成)\]**​ をクリックして ​**\[Choose Global Type (グローバル種別の選択)\]**​ ビューを開きます。
3. **\[Filter (検索条件)\]**​ 項目に「​`database`​」と入力し、​**\[Database Config (データベース設定)\]**​ を選択して ​**\[OK\]**​ をクリックします。
4. **\[Database Config (データベース設定)\]**​ ウィンドウで ​**\[Name (名前)\]**​ 項目を ​`dbConfig`​ に設定します。
5. **\[Connection (接続)\]**​ 項目で ​**\[Oracle Connection (Oracle 接続)\]**​ を選択します。
6. **\[Configure (設定)\]**​ をクリックし、必要な Oracle JDBC ドライバーを追加して、次のいずれかを選択します。  
    
    - **Use local file (ローカルファイルを使用)**​  
        ローカルファイルを使用してライブラリをインストールします。
    - **Add Maven dependency (Maven 連動関係を追加)**​  
        Maven 連動関係をインストールしてプロジェクトに追加します。
7. **\[Connection (接続)\]**​ セクションで、次のパラメーターを設定します。  
    
    - **Host (ホスト)**​: `localhost`
    - **Port (ポート)**​: `1521`
    - **User (ユーザー)**​: `SYS as SYSDBA`
    - **Password (パスワード)**​: `Oradoc_db1`
    - **Instance (インスタンス)**​: `ORCLCDB`
8. **\[Advanced (詳細)\]**​ タブで ​**\[Column types (列の型)\]**​ 項目を ​**\[Edit inline (インライン編集)\]**​ に設定します。
9. プラス記号 ​**(+)**​ をクリックして、新しい列の型を追加し、すでに作成されているすべての UDT をリストします。
10. 次の値を ​**\[Id\]**​ および ​**\[Type name (型名)\]**​ 項目に指定します。
    
    <table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 30%;">
<col style="width: 70%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Id</th>
<th class="tableblock halign-left valign-top">型名</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>2003</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>PEOPLE</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>2003</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>PHONE_NUMBER</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>2008</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>PERSON</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>2003</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>PHONE_ARRAY</code></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>2003</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>PHONE_BOOK</code></p>
</div></div></td>
</tr>
</tbody>
</table>
11. **\[Finish (完了)\]**​ をクリックして、​**\[Column Type (列の型)\]**​ ウィンドウを閉じます。
12. **\[Test Connection (接続をテスト)\]**​ をクリックして、Mule がデータベースに接続できることを確認します。
13. **\[OK\]**​ をクリックします。

次のスクリーンショットは、Studio での HTTP リスナーのグローバル要素設定を示しています。

![HTTP リスナーのグローバル要素設定](/mulesoft/current/ja-jp/db-connector/1.10/_images/database-oracleudt-example-1.png)

Figure 2. HTTP リスナーの設定

次のスクリーンショットは、Studio でのデータベースのグローバル要素設定を示しています。

![\[Host (ホスト)\]、\[Port (ポート)\]、\[User (ユーザー)\]、\[Password (パスワード)\] 項目を設定するデータベースのグローバル要素設定。](_images/database-oracleudt-example-2.png)

Figure 3. \[Database Config (データベース設定)\] の \[General (一般)\] 設定

![「Column types (列の型)」 項目を設定するデータベースのグローバル要素詳細設定](/mulesoft/current/ja-jp/db-connector/1.10/_images/database-oracleudt-example-3.png)

Figure 4. \[Database Config (データベース設定)\] の \[Advanced (詳細)\] 設定

## [](#mule-アプリケーションの作成実行テスト)Mule アプリケーションの作成、実行、テスト

Oracle データベース接続を設定したら、Mule アプリケーションを作成、実行、およびテストして、ストアドプロシージャーをコールします。

### [](#http-リスナーと-set-payload-コンポーネントの設定)HTTP リスナーと Set Payload コンポーネントの設定

Mule フローを作成する手順は、次のとおりです。

1. **\[Mule Palette (Mule パレット)\]**​ ビューで、\[HTTP\] の ​**\[Listener\]**​ ソースを選択してキャンバスにドラッグします。  
    このソースは受信 HTTP メッセージ属性をリスンすることでフローを開始します。
2. **\[Connector configuration (コネクタ設定)\]**​ 項目で ​`HTTP_Listener_config`​ グローバル設定を選択します。
3. **\[Path (パス)\]**​ 項目を ​`/oracle`​ に設定します。
4. **\[Set Payload\]**​ コンポーネントを ​**\[Listener\]**​ の右にドラッグします。  
    このコンポーネントでは、処理のためにストアドプロシージャーに送信する項目のリストを作成します。
5. **\[Value (値)\]**​ 項目で、リストする項目を指定します。  
    
    ```xml
    [{'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'}},
    	]
    ```
6. **\[Mime Type (MIME タイプ)\]**​ 項目を ​`application/java`​ に設定します。

![Set payload コンポーネントの設定](/mulesoft/current/ja-jp/db-connector/1.10/_images/database-oracleudt-example-4.png)

Figure 5. Set Payload の設定

### [](#dataweave-関数を使用した-transform-message-コンポーネントの設定)DataWeave 関数を使用した Transform Message コンポーネントの設定

**Transform Message**​ コンポーネントと、アプリケーションデータをカスタムユーザーデータ型の例にマップする ​`createStruct`​ および ​`createArray`​ DataWeave 関数を使用して、Mule アプリケーションの作成を継続します。

1. **\[Transform Message\]**​ コンポーネントを ​**\[Set Payload\]**​ の右にドラッグします。  
    このコンポーネントでは、ストアドプロシージャーで入力パラメーターとして想定されているデータ型 ​`PEOPLE`​ にマップできるオブジェクトに JSON オブジェクトが変換されます。
2. Studio キャンバスでコンポーネントをダブルクリックして、名前を ​`Transform Message - Prepare UDT`​ に設定します。
3. コンポーネントの ​**\[Output (出力)\]**​ ソースコードビューで ​**\[Edit Current Target (現在の対象を編集)\]**​ ボタンをクリックします。
4. **\[Selection dialog (選択ダイアログ)\]**​ ボックスで ​**\[Output (出力)\]**​ 項目を ​`Variable`​、​**\[Variable name (変数名)\]**​ を ​`in_people_tab`​ に設定し、​**\[OK\]**​ をクリックします。
5. **\[Output (出力)\]**​ 項目で、​`createStruct`​ および ​`createArray`​ 関数が含まれる次の DataWeave 式を指定します。
    
    ```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) ) )
    ```
    
    ![Transform Message の設定](/mulesoft/current/ja-jp/db-connector/1.10/_images/database-oracleudt-example-6.png)
    
    Figure 6. Transform Message の設定

`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`​ 関数を使用する場合、複合型に合わせてこれらの関数を組み合わせることができます。

### [](#stored-procedure-操作の設定)Stored Procedure 操作の設定

Database Connector の ​**Stored Procedure**​ 操作を使用して、UDT を使用する Oracle ストアドプロシージャーをコールします。

1. **\[Stored procedure\]**​ 操作を ​**\[Transform Message\]**​ の右にドラッグします。  
    この操作では、Database Connector を使用してストアドプロシージャーがコールされます。
2. **\[Connector configuration (コネクタ設定)\]**​ 項目で ​`dbConfig`​ グローバル設定を選択します。
3. **\[SQL Query Text (SQL クエリテキスト)\]**​ 項目に「​`{ call proc_insert_humans(:people, :phoneBook) }`​」と入力します。
4. **\[Input Parameters (入力パラメーター)\]**​ 項目に「​`{ people: vars.in_people_tab}`​」と入力します  
    このステップでは、​`in_people_tab`​ という変数に保存された変換の出力が入力パラメーターにマップされます。
5. **\[Output Parameters (出力パラメーター)\]**​ 項目で ​`Edit inline`​ を選択し、プラス記号 (​**+**​) をクリックしてカスタムパラメーターを設定します。
    
    - **Key (キー)**​: `phoneBook`
    - **Custom type (カスタム型)**​: `PHONE_BOOK`

![ストアドプロシージャーの設定](/mulesoft/current/ja-jp/db-connector/1.10/_images/database-oracleudt-example-5.png)

Figure 7. ストアドプロシージャーの設定

1. 2 つ目の ​**\[Transform Message\]**​ コンポーネントを ​**\[Stored Procedure\]**​ の右にドラッグします。
2. Studio キャンバスでコンポーネントをダブルクリックして、名前を ​`Transform Message - response to JSON`​ に設定します。
3. コンポーネントの ​**\[Output (出力)\]**​ ソースコードビューで、次の DataWeave 式を設定します。

```DataWeave
%dw 2.0
output application/json
---
payload
```

### [](#mule-アプリケーションの実行およびテスト)Mule アプリケーションの実行およびテスト

Mule アプリケーションを実行およびテストする手順は、次のとおりです。

1. Studio でプロジェクトを保存します。
2. ターミナルで curl コマンド「​`curl localhost:8081/oracle`​」を使用して、アプリケーションをテストします。  
    このストアドプロシージャーでは、テーブル ​`HUMANS`​ に追加されているすべての個人の電話番号のリストが返されます。

## [](#udt-を使用する-oracle-ストアドプロシージャーをコールするための-xml)UDT を使用する Oracle ストアドプロシージャーをコールするための XML

この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディターに貼り付けます。

```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>
```

## [](#関連情報)関連情報

- [Database Connector の例](https://docs.mulesoft.com/jp/db-connector/1.10/database-connector-examples)
- [MuleSoft ヘルプセンター](https://help.mulesoft.com)