更新时间:2023-04-23 GMT+08:00

数据API执行语句开发

SQL语法

数据API与各数据库的SQL语法差异:
  • 如果需要把后端服务请求中携带的参数传递给SQL,使用${参数名}的方式传递,其中String类型的参数需要用单引号括起来,int类型的参数则不需要。

    如以下示例,name为String类型参数,id为int类型参数。

    1
    select * from table01 where name='${name}' and id=${id}
    
  • 参数可以在后端服务请求的Headers、Parameters或者Body中传递。
  • 如果SQL中的字符串含关键字,需要对字符串转义。

    如某个字段名为delete,则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)
SQL查询样例(update、insert等命令类似):
  • 全量查询
    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查询
    默认删除重复数据,如需返回全部数据,使用关键字:union all
    1
    2
    3
    select * from table01 
    union [all | distinct]
    select * from table02;
    
  • 嵌套查询
    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数据源支持的命令:

    find

NoSQL样例:
  • 插入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中定义的参数名不能相同,否则将被覆盖。
    • Body传递参数示例:

      后端服务请求的Body内容

      {
        "nname.String.in": "zhang",
        "nsal": 0
      }

      响应结果

      {
        "test": [
          5000
        ]
      }
    • Parameters传递参数示例:

      后端服务请求的Parameters内容

      https://example.com?nname.String.in=zhang&nsal=0

      响应结果

      {
        "test": [
          5000
        ]
      }

多个数据源编排

一个数据API可以包含多个数据源,因此一次API请求可以涉及多个数据源,例如取第一个数据源查询结果作为第二个数据源的参数。

以MySQL为例说明,假设数据API有数据源1和数据源2,user01是数据源1的数据表和user02是数据源2的数据表,两张表的结构如下:

表2 表结构

数据源

表名

参数

数据源1

user01

  • id(int)
  • name(varchar)

数据源2

user02

  • user_id(int)
  • user_name(varchar)
  • user_age(int)
  • user_sex(varchar)

数据源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';