# Oracle プロシージャ タスク

このタスクは、Oracle データベースに格納されているプロシージャを呼び出すもので、個々のデータ型に応じてデータのリストまたは特定のデータ型の値を返します。

## パラメータ

### プロシージャ コード

- プロシージャ コードは、*プロシージャ名*と*パラメータ*に基づいて自動生成されるコードで、ユーザーが手動で入力する必要はありません。
- たとえば、プロシージャの名前が*mcs.myproc*で、パラメータが*id*と*out_name*で構成されている場合、次のように表現されます：

```text
mcs.myproc(:id, :out_name);
```

### プロシージャ名

- プロシージャの名前を指定します。
- プロシージャがパッケージまたはユーザー名で区別される必要がある場合は、ピリオド(.)を使用してそれらを区別します。
- 例：

```text
mcs.myproc
```

### パラメータ

- パラメータは次の要素で構成されています。
  - パラメータ名
  - ディレクション: IN、INOUT、OUT
  - データ型: String、Number、Date、Cursor
  - 値: 入力変数の場合、対応する値
  - 最大サイズ: String または Buffer データ型の場合、変数の最大サイズを指定します。

#### パラメータ名

パラメータ名は、プロシージャで使用されるパラメータの名前を指定します。前述の例では、'id'と'out_name'がパラメータ名です。

### ディレクション

変数が入力(IN)または出力(OUT)変数かを指定します。

### データ型

パラメータのデータ型を指定します。データ型は、プロシージャを作成する際に指定された名前と完全に一致するように指定する必要があります。

たとえば、プロシージャが次のように実装されている場合：

```sql
CREATE OR REPLACE NONEDITIONABLE PROCEDURE myproc (in_id IN VARCHAR2, out_name OUT VARCHAR2) AS
BEGIN
    SELECT name INTO out_name FROM MCS.FMB_USERS WHERE id = in_id ;
END;
```

最初のパラメータと 2 番目のパラメータはどちらも VARCHAR2 型です。

このようなプロシージャを呼び出す場合、パラメータのタイプは両方とも String として指定し、出力の場合は最大サイズも指定する必要があります。

ここに指定方法の例があります：

![procedure example1](./assets/../../../../assets/images/oracle-procedure-example1.png 'procedure example1')

### アクセサー

設定は[JSONATA のドキュメント](http://docs.jsonata.org/overview.html)に従います。

「アクセサー」が指定されている場合、そのアクセサーで構成された値がパラメータの値として使用されます。アクセサー操作から結

果が生成されない場合、
「値（val）」設定で指定された値が使用されます。

### 値(val)

パラメータが入力(IN)の場合、このフィールドに値を指定します。このフィールドには「定数」値を直接入力します。

前述の例では、'id'パラメータの入力値として'ID'が指定されている場合、ID タスクから返された値を入力値として使用する必要があります。

「アクセサー」設定から結果が生成されない場合、この値が使用されます。

### 最大サイズ

String または Buffer データ型のパラメータの場合、最大サイズを指定します。他のデータ型に対してはこの値を指定しないでください。

## タスクの結果

プロシージャを呼び出した結果は、オブジェクト形式で返され、出力として指定されたパラメータ名がキーとなり、それに対応する値が返されます。

例えば、上記のタスクでは、結果の値は以下のようになります：

```javascript
{
  out_name: 'Admin'
}
```

## 別の例（カーソル）

### プロシージャの実装例

```sql
CREATE OR REPLACE NONEDITIONABLE PROCEDURE PROCEDURE1(out_cursor OUT SYS_REFCURSOR) AS
BEGIN
    BEGIN
        OPEN out_cursor FOR
            SELECT * FROM FARMWEATHER WHERE rownum <= 1000;
    END;
END PROCEDURE1;
```

### プロシージャの呼び出し例

![procedure example2](./assets/../../../../assets/images/oracle-procedure-example2.png 'procedure example2')

### プロシージャ呼び出しのタスク結果

```javascript
{
  "out_cursor": [
    {
      "FARMDATE": "2006-01-07T15:00:00.000Z",
      "MAXT": 29.5,
      "MINT": 21.8,
      "WINDSPEED": 1.6,
      "FARMHUM": 70.2,
      "PRECIPITATION": 0
    },
    {
      "FARMDATE": "2006-01-08T15:00:00.000Z",
      "MAXT": 30.1,
      "MINT": 21,
      "WINDSPEED": 1.6,
      "FARMHUM": 67.4,
      "PRECIPITATION": 0
    },
    ..
  ]
}
```
