在 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)
    )