
# 存储过程调用
当前数据API不支持直接创建存储过程，但是可以执行MySQL、Oracle、PostgreSQL这三种数据源的存储过程，以Oracle数据库为例说明。
#### 数据源说明
假设数据库里面有一张表，表结构如下建表语句所示：
```
create table sp_test(id number,name varchar2(50),sal number);
```
往表中并插入数据，数据集如下表所示：
表1sp_test表数据集 
| ID | NAME  | SAL  |
|:---|:---|:---|
| 1  | ZHANG | 5000 |
| 2  | LI    | 6000 |
| 3  | ZHAO  | 7000 |
| 4  | WANG  | 8000 |
   
在Oracle数据库中调用存储过程，根据name查询sal的值。
```
create or replace procedure APICTEST.sb_test(nname in varchar, nsal out number) as
begin
select sal into nsal from sp_test where name = nname;
end;
```
#### 数据API中的执行语句说明
数据API调用存储过程时，参数可通过后端服务请求的Headers、Parameters或者Body传递，参数名的语法为：**{参数名}.{数据类型}.{传输类型}**。
- 数据类型包括String和int。
- 传输类型指入参或出参声明，入参使用**in** ，出参使用**out**。
数据API中调用存储过程的执行语句示例：
```
call sb_test(${nname.String.in},${nsal.int.out})
```
该脚本示例中，nname为字符串类型的入参，参数名为nname.String.in ，value则是你要查询的参数值。nsal为数值类型的出参，参数名为nsal.int.out，由于格式限定，出参的value也需要填写，可填写符合数据类型的任意值，不影响输出结果。
![](https://support.huaweicloud.com/devg-roma/public_sys-resources/note_3.0-zh-cn.png)
- 数据API中对存储过程的调用，用String和int来区分字符串和数值，无需加单引号，这一点和SQL要求不一样。
- 在后端服务的Headers、Parameters或者Body中定义的参数名不能相同，否则将被覆盖。
 
- Body传递参数示例： 后端服务请求的Body内容
  ```
  {
    "nname.String.in": "zhang",
    "nsal": 0
  }
  ```
  响应结果
  ```
  {
    "test": [
      5000
    ]
  }
  ```
  
- Parameters传递参数示例： 后端服务请求的Parameters内容
  ```
  https://example.com?nname.String.in=zhang&nsal=0
  ```
  响应结果
  ```
  {
    "test": [
      5000
    ]
  }
  ```
  
 
