数据API执行语句开发
SQL语法
- 如果需要把后端服务请求中携带的参数传递给SQL,使用${参数名}的方式传递,其中String类型的参数需要用单引号括起来,int类型的参数则不需要。
如以下示例,name为String类型参数,id为int类型参数。
1
select * from table01 where name='${name}' and id=${id}
- 参数可以在后端服务请求的Headers、Parameters或者Body中传递。
- 如果SQL中的字符串含关键字,需要对字符串转义。
1
select `delete` from table01
若在SQL语句中同时引用多种数据类型的后端请求参数时,系统会默认把传入的参数转换为String类型。因此在执行SQL语句时,需要调用相应的函数对非String类型参数做数据类型转换。
以上面的name(String类型)和id(int类型)参数为例,在同时传入SQL语句时,id参数会被转换为String类型,需要在SQL语句中,使用转换函数把id参数再转换回int类型。此处以cast()函数为例,不同数据库使用的转换函数会有所不同。
1
|
select * from table01 where name='${name}' and id=cast('${id}' as int) |
- 全量查询
1
select * from table01;
- 带参数查询
指把后端服务请求中携带的参数(Headers、Parameters或者Body参数)传递给SQL,为SQL语句提供灵活的条件查询或数据处理能力。
- GET、DELETE方法的API,从请求URL中获取参数。
- POST、PUT方法的API,从Body中获取参数。注意:Body体为application/x-www-form-urlencoded格式。
1
select * from table01 where 1=1 and col01 = ${param01};
- 可选参数查询
1
select * from table01 where 1=1 [and col01 = ${param01}] [and col02 = ${param02}]
- IN查询
1
select * from table01 where 1=1 and col01 in ('${param01}','${param02}');
- UNION查询
- 嵌套查询
1
select * from table01 where 1=1 and col01 in (select col02 from table02 where col03 is not null);
NoSQL(MongoDB、Redis等)兼容的源生命令:
- Redis数据源支持的命令:
GET、HGET、HGETALL、LRANGE、SMEMBERS、ZRANGE、ZREVRANGE、SET、LPUSH、SADD、ZADD、HMSET、DEL
- MongoDB数据源支持的命令:
- 插入String类型的key,value从请求参数中获取。
set hello ${parm01}
- 查询String类型的key
get hello
存储过程调用
当前数据API不支持直接创建存储过程,但是可以执行MySQL、Oracle、PostgreSQL这三种数据源的存储过程,以Oracle数据库为例说明。
- 数据源说明
假设数据库里面有一张表,表结构如下建表语句所示:
1
create table sp_test(id number,name varchar2(50),sal number);
往表中并插入数据,数据集如下表所示:
表1 sp_test表数据集 ID
NAME
SAL
1
ZHANG
5000
2
LI
6000
3
ZHAO
7000
4
WANG
8000
在Oracle数据库中调用存储过程,根据name查询sal的值。
1 2 3 4
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中调用存储过程的执行语句示例:
1
call sb_test(${nname.String.in},${nsal.int.out})
该脚本示例中,nname为字符串类型的入参,参数名为nname.String.in ,value则是你要查询的参数值。nsal为数值类型的出参,参数名为nsal.int.out,由于格式限定,出参的value也需要填写,可填写符合数据类型的任意值,不影响输出结果。
- 数据API中对存储过程的调用,用String和int来区分字符串和数值,无需加单引号,这一点和SQL要求不一样。
- 在后端服务的Headers、Parameters或者Body中定义的参数名不能相同,否则将被覆盖。
多个数据源编排
一个数据API可以包含多个数据源,因此一次API请求可以涉及多个数据源,例如取第一个数据源查询结果作为第二个数据源的参数。
以MySQL为例说明,假设数据API有数据源1和数据源2,user01是数据源1的数据表和user02是数据源2的数据表,两张表的结构如下:
数据源 |
表名 |
参数 |
---|---|---|
数据源1 |
user01 |
|
数据源2 |
user02 |
|
数据源SQL设计如下:
数据源1,在表user01中查找name为“zhang”的数据记录id。
1
|
select id from user01 where name='zhang'; |
数据源2,根据user01中找到的id,在user02中找到对应的数据记录,并把该记录的user_name的值更新为“zhang”。
1
|
update user02 set user_name='zhang' where user_id=${result1[0].id}; |
可选参数的使用
数据API中使用中括号[]标记可选参数,例如以下SQL执行语句:
1
|
select * from table01 where id=${id} [or sex='${sex}'] |
用[]括起来的那部分语句,表示当后端服务请求中携带参数${sex}时候,才会生效;不带参数${sex}的时候,[]括起来的语句在执行时将被忽略。
- 后端服务请求携带了参数id=88,可选参数sex没有携带,则执行SQL语句:
1
select * from table01 where id=88;
- 后端服务请求携带了参数id=88和sex=female,则执行SQL语句:
1
select * from table01 where id=88 or sex='female';