在 Postgres 中从 JSON 更新记录的函数
Function to update records from JSON in Postgres
我想创建一个接受如下输入参数的函数:
[
{
"id": 1,
"organization_name": "Test Solutions",
"website": "[www..test.solutions]",
"contact_person": "John Doe"
}
]
我可以通过 pgadminIII 中的简单查询更新记录,它没有给我任何错误,但是除了 JPA 中的函数外,没有其他方法可以使用这个查询,它将在查询中输入。以下是我的更新查询:
UPDATE organization p
SET (organization_name,emails,contacts,relation_type_id,website,cst_no,vat_tin_no,contact_person)=
(COALESCE(ab.organization_name, p.organization_name)
,COALESCE(ab.website, p.website)
,COALESCE(ab.contact_person, p.contact_person)
)
FROM (
select * from json_populate_recordset
(null::organization,'[{"id":1,"organization_name":"Test Solutions","website":"[www..test.solutions]","contact_person":"John Doe"}]')
) ab
WHERE p.id = ab.id;
如何在 JPA 中创建一个函数,该函数将通过传递 JSON 来工作,如上所示:
我尝试了一个函数,在传递参数时出现错误。
以下是函数语法:
CREATE OR REPLACE FUNCTION cloudschema.org_bulk_edit_json(IN j json)RETURNS SETOF record AS
$BODY$
BEGIN
UPDATE cloudschema.organization p
SET (organization_name,emails,contacts,relation_type_id,website,cst_no,vat_tin_no,contact_person)=
(COALESCE(ab.organization_name, p.organization_name)
,COALESCE(ab.website, p.website)
,COALESCE(ab.contact_person, p.contact_person)
)
FROM (
select * from json_populate_recordset
(null::cloudschema.organization,)
) ab
WHERE p.id = ab.id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
您的查询(和函数)无法运行,因为列数与值数不匹配。此外,函数 returns 没有任何内容,因此应将其声明为 RETURNS void
.
CREATE OR REPLACE FUNCTION cloudschema.org_bulk_edit_json(IN j json)
RETURNS void AS
$BODY$
BEGIN
UPDATE cloudschema.organization p
SET (organization_name, website, contact_person) =
(
COALESCE(ab.organization_name, p.organization_name),
COALESCE(ab.website, p.website),
COALESCE(ab.contact_person, p.contact_person)
)
FROM json_populate_recordset(null::cloudschema.organization,) ab
WHERE p.id = ab.id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
如果要更新更多列,请在SET
中添加适当的值,例如:
SET (organization_name, emails, contacts, website, contact_person) =
(
COALESCE(ab.organization_name, p.organization_name),
COALESCE(ab.emails, p.emails),
COALESCE(ab.contacts, p.contacts),
COALESCE(ab.website, p.website),
COALESCE(ab.contact_person, p.contact_person)
)
我想创建一个接受如下输入参数的函数:
[
{
"id": 1,
"organization_name": "Test Solutions",
"website": "[www..test.solutions]",
"contact_person": "John Doe"
}
]
我可以通过 pgadminIII 中的简单查询更新记录,它没有给我任何错误,但是除了 JPA 中的函数外,没有其他方法可以使用这个查询,它将在查询中输入。以下是我的更新查询:
UPDATE organization p
SET (organization_name,emails,contacts,relation_type_id,website,cst_no,vat_tin_no,contact_person)=
(COALESCE(ab.organization_name, p.organization_name)
,COALESCE(ab.website, p.website)
,COALESCE(ab.contact_person, p.contact_person)
)
FROM (
select * from json_populate_recordset
(null::organization,'[{"id":1,"organization_name":"Test Solutions","website":"[www..test.solutions]","contact_person":"John Doe"}]')
) ab
WHERE p.id = ab.id;
如何在 JPA 中创建一个函数,该函数将通过传递 JSON 来工作,如上所示:
我尝试了一个函数,在传递参数时出现错误。 以下是函数语法:
CREATE OR REPLACE FUNCTION cloudschema.org_bulk_edit_json(IN j json)RETURNS SETOF record AS
$BODY$
BEGIN
UPDATE cloudschema.organization p
SET (organization_name,emails,contacts,relation_type_id,website,cst_no,vat_tin_no,contact_person)=
(COALESCE(ab.organization_name, p.organization_name)
,COALESCE(ab.website, p.website)
,COALESCE(ab.contact_person, p.contact_person)
)
FROM (
select * from json_populate_recordset
(null::cloudschema.organization,)
) ab
WHERE p.id = ab.id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
您的查询(和函数)无法运行,因为列数与值数不匹配。此外,函数 returns 没有任何内容,因此应将其声明为 RETURNS void
.
CREATE OR REPLACE FUNCTION cloudschema.org_bulk_edit_json(IN j json)
RETURNS void AS
$BODY$
BEGIN
UPDATE cloudschema.organization p
SET (organization_name, website, contact_person) =
(
COALESCE(ab.organization_name, p.organization_name),
COALESCE(ab.website, p.website),
COALESCE(ab.contact_person, p.contact_person)
)
FROM json_populate_recordset(null::cloudschema.organization,) ab
WHERE p.id = ab.id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
如果要更新更多列,请在SET
中添加适当的值,例如:
SET (organization_name, emails, contacts, website, contact_person) =
(
COALESCE(ab.organization_name, p.organization_name),
COALESCE(ab.emails, p.emails),
COALESCE(ab.contacts, p.contacts),
COALESCE(ab.website, p.website),
COALESCE(ab.contact_person, p.contact_person)
)