我在使用postgres函数时遇到了一些麻烦,在该函数中,我要删除行并返回不存在该行的json_build_object。
代码如下:
CREATE OR REPLACE FUNCTION DeleteXJSON(
in_x_id BIGINT)
RETURNS SETOF JSON AS
$BODY$
DECLARE
ref_json_data JSON;
BEGIN
DELETE FROM xtable WHERE x_id = in_x_id
RETURNING json_build_object('x_id', x_id) INTO ref_json_data;
RETURN QUERY (select ref_json_data);
END
$BODY$
LANGUAGE plpgsql
当找到要删除的行时,这很好用,但是当找不到行时,它最终返回1行而不是预期的0行。
我简化了json_build_object字段,因为实际上我在其中返回了许多字段。我如何正确处理此问题,以便0行不存在时返回?如果有更好的方法来解决此问题,请告诉我。
我修复了伪造的END IF。但是,如果我通过psql运行此命令:
select * from deletexjson(1);
我得到以下信息:
deletecampjson
----------------
(1 row)
答案 0 :(得分:2)
eurotrash和S-Man指出的错误是流浪END IF
。
但是,如当前所述,不需要将已删除的行的json存储到ref_json_data
中。也没有任何程序元素。也就是说,您可以编写一个SQL函数而不是PLPGSQL函数:
CREATE OR REPLACE FUNCTION deletexjson (xid BIGINT)
RETURNS SETOF JSON AS
$$
DELETE FROM xtable WHERE x_id = xid
RETURNING JSON_BUILD_OBJECT('x_id', x_id, 'x_rand', x_rand);
$$
LANGUAGE SQL
表示相同逻辑的较短表达(可能更快的评估)。