PLPGSQL解析json IN参数和组合json OUT参数
我试图在postgres服务器上创建一个存储函数,它可以处理json参数。服务器版本是12。它被用作android应用程序的后端服务器 当前从数据库检索数据的过程如下: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
{
"updateDate": 20200101
}
{
"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语言