【问题标题】:PLPGSQL parse json IN parameter and compose json OUT parameterPLPGSQL 解析 json IN 参数并编写 json OUT 参数
【发布时间】:2020-12-31 00:43:48
【问题描述】:

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

目前从DB取数据的流程如下:

  1. APP ---(http post request with json)---> Nodejs handlers server
  2. Nodejs 处理程序服务器(解析 App json 并验证数据)
  3. Nodejs 处理程序服务器 Postgres 服务器
  4. Nodejs 处理程序服务器(为 App 编写 json 响应)
  5. 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;

感谢您的帮助

【问题讨论】:

    标签: json postgresql plpgsql


    【解决方案1】:

    它需要一点点努力,因为 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 类型的函数列表 - https://www.postgresql.org/docs/current/functions-json.html

    为了你的目的可以是有趣的其他PL语言https://github.com/plv8/plv8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      相关资源
      最近更新 更多