# Oracle Procedure Task

Oracle 데이터베이스에 저장되어 있는 프로시저를 호출하는 태스크이며,
개별 데이터 타입에 따라서 데이터의 리스트 혹은 특정 데이터 타입의 값을 반환한다.

## Parameters

### 프로시저 코드

- 프로시저 코드는 *프로시저 이름*과 *파라미터*에 의해서 자동으로 생성되는 코드로서, 별도로 사용자가 입력할 필요는 없다.
- 만약, 프로시저의 이름이 *mcs.myproc*이고, 파라미터가 *id*와 *out_name*으로 구성된다면, 다음과 같이 표현된다.
  ```text
  mcs.myproc(:id, :out_name);
  ```

### 프로시저 이름

- 프로시저의 이름을 지정한다.
- 프로시저가 패키지나 사용자 이름등으로 구분이 필요할 경우 '.'을 통해서 구분한다.
- 사용 예.
  ```text
  mcs.myproc
  ```

### 파라미터

- 파라미터는 다음과 같은 요소로 구성되어 있다.
  - 파라미터 이름
  - 입출력 지정: IN, INOUT, OUT
  - 파라미터 타입: String, Number, Date, Cursor
  - 값: 해당 변수가 입력일 경우, 해당 입력에 대한 값
  - 최대크기: 해당 변수타입이 String이나 Buffer일 경우, 변수의 최대 크기를 지정.

#### 파라미터 이름

파라미터 이름은 프로시저 작성에 사용된 파라미터의 이름을 지정한다.
앞의 예의 경우,

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

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')

### 접근자 [accessor](../concept/data-accessor.md)

설정 방법은 [JSONATA 도큐먼트](http://docs.jsonata.org/overview.html)를 따른다.

'접근자'가 지정되면, 해당 접근자로 조성된 값이 프로시져의 파라미터로 사용된다.

아래 '값' 설정이 '상수'라면, 접근자 설정은 '변수'라고 할 수 있다.

접근자 설정은 다음의 '값' 설정에 우선순위이다. 즉, 만약에 이 '접근자'가 설정되어있으면, '값(val)' 설정에 우선하여 '접근자' 연산의 결과가 프로시져 파라미터 값이 된다.
결과 값이 없으면, '값'에 설정된 값이 사용된다.

### 값(val)

파라미터가 입력(IN)일 경우, 해당 값을 지정한다.
해당 값에 바로 "상수" 값을 입력한다.

위의 예어서 id의 입력 값을 ID라고 지정되어 있다면, ID 태스크에서 반환되는 값을 입력 값으로 지정한다.

이 값은 위 '접근자' 설정에 따른 결과가 없는 경우에 이 '값'이 사용된다.

### 최대 크기

파라미터 타입이 String이나 Buffer 일 경우, 최대 크기를 지정한다. 다른 타입의 경우 값을 지정하지 않고 무시한다.

## 태스크 결과

프로시저 호출에 대한 결과는 Object 형태로 반환되며, 파라미터 중에서 출력으로 지정된 파라미터 이름이 키가 되어 값을 반환한다.

만약, 위에서 소개된 태스크의 경우 다음과 같은 결과 값을 반환한다.

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

## 다른 사용 예(커서)

### 프로시저 작성 예

```sql
CREATE OR REPLACDE 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
    },
    ..
  ]
}
```
