PLPGSQL解析json IN参数和组合json OUT参数

PLPGSQL解析json IN参数和组合json OUT参数,json,postgresql,plpgsql,Json,Postgresql,Plpgsql,我试图在postgres服务器上创建一个存储函数,它可以处理json参数。服务器版本是12。它被用作android应用程序的后端服务器 当前从数据库检索数据的过程如下: { "updateDate": 20200101 } APP-->(带json的http post请求)--->Nodejs处理程序服务器 Nodejs处理程序服务器(解析应用程序json并验证数据) Nodejs处理程序服务器Postgres服务器 Nodejs处理程序服务器(为应用程序编写jso

我试图在postgres服务器上创建一个存储函数,它可以处理json参数。服务器版本是12。它被用作android应用程序的后端服务器

当前从数据库检索数据的过程如下:

{
    "updateDate": 20200101
}
  • APP-->(带json的http post请求)--->Nodejs处理程序服务器
  • Nodejs处理程序服务器(解析应用程序json并验证数据)
  • Nodejs处理程序服务器Postgres服务器
  • Nodejs处理程序服务器(为应用程序编写json响应)
  • Nodejs处理程序服务器--(带json的http响应)--->APP
  • 主要缺点是Nodejs处理程序和Postgres服务器之间存在多个查询和进程。我决定通过准备一个包含用户数据和所需操作的复杂json处理程序来优化它,并将其发送到Postgres服务器,后者必须解析它并使用表完成所有作业,然后用所有需要的结果组成一个json。但我完全不知道如何在Postgres服务器上的存储函数中解析和编写json

    例如,如果我有这个简单的json№1:

    {
        "fields": ["name", "age", "rating"],
        "values": ["alex", 24, 7.0],
        "type": ["string", "integer", "real"]
    }
    
    我需要发回json№2如下:

    {
        "updateDate": 20200101
    }
    
    例如,我如何从第一个json中获取24 int值,并在函数中合成第二个json

    CREATE FUNCTION update_user (IN data json, OUT result JSON) AS $$
    DECLARE
       age int;
    BEGIN
       age := ???
       ...(sql query)...
       result := ???
    END $$
    LANGUAGE plpgsql;
    

    感谢您的帮助,它需要一点点的努力,因为PLpgSQL语言不太支持复杂结构(像更现代的或动态的语言一样),在复杂结构和json之间没有区别(但对于PLpgSQL,json类型是+/-文本类型)

    如果要使用更快的执行速度,则需要自定义类型:

    CREATE TYPE response_type AS ("fields" text[], "values" text[], "type" text[]);
    
    使用此类型,您可以编写函数:

    CREATE OR REPLACE FUNCTION update_user(IN data json)
    RETURNS json AS $$
    DECLARE                         
      resp response_type;
      age int;
    BEGIN
      resp := json_populate_record(resp, data);
      age := resp."values"[array_position(resp."fields", 'age')];
      RAISE NOTICE '%', age;
    
      RETURN json_build_object('updateDate', CURRENT_DATE);
    END;
    $$ LANGUAGE plpgsql;
    
    postgres=# select update_user('{
        "fields": ["name", "age", "rating"],
        "values": ["alex", 24, 7.0],
        "type": ["string", "integer", "real"]
    }');
    NOTICE:  24
    ┌───────────────────────────────┐
    │          update_user          │
    ╞═══════════════════════════════╡
    │ {"updateDate" : "2020-09-13"} │
    └───────────────────────────────┘
    (1 row)
    
    对于PLpgSQL,您必须检查json类型的函数列表-


    出于您的目的,其他PL语言可能会很有趣,因为PLpgSQL语言不能很好地支持复杂结构(像更现代的或动态的语言一样),所以它需要一点艰苦的工作(但对于PLpgSQL来说,json类型是+/-文本类型)

    如果要使用更快的执行速度,则需要自定义类型:

    CREATE TYPE response_type AS ("fields" text[], "values" text[], "type" text[]);
    
    使用此类型,您可以编写函数:

    CREATE OR REPLACE FUNCTION update_user(IN data json)
    RETURNS json AS $$
    DECLARE                         
      resp response_type;
      age int;
    BEGIN
      resp := json_populate_record(resp, data);
      age := resp."values"[array_position(resp."fields", 'age')];
      RAISE NOTICE '%', age;
    
      RETURN json_build_object('updateDate', CURRENT_DATE);
    END;
    $$ LANGUAGE plpgsql;
    
    postgres=# select update_user('{
        "fields": ["name", "age", "rating"],
        "values": ["alex", 24, 7.0],
        "type": ["string", "integer", "real"]
    }');
    NOTICE:  24
    ┌───────────────────────────────┐
    │          update_user          │
    ╞═══════════════════════════════╡
    │ {"updateDate" : "2020-09-13"} │
    └───────────────────────────────┘
    (1 row)
    
    对于PLpgSQL,您必须检查json类型的函数列表-

    出于您的目的,可以使用其他PL语言