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

第一个和第二个参数都是 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
    },
    ..
  ]
}
```
