【问题标题】:Handling no records found in delete statement with returning json_build_object in Postgres处理删除语句中未找到记录并在 Postgres 中返回 json_build_object
【发布时间】:2018-10-01 13:53:30
【问题描述】:

我在删除一行并返回该行不存在的 json_build_object 的 postgres 函数时遇到了一些问题。

代码如下:

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 行?如果有更好的方法来处理这个问题,请告诉我。

更新 #1:

我修复了虚假的 END IF。但是,如果我通过 psql 运行它:

select * from deletexjson(1);

我得到以下信息:

 deletecampjson 
 ----------------

 (1 row)

【问题讨论】:

  • 重新检查你的代码;你有一个 END IF 没有开口 IF
  • (删除你后END IF;)为我工作:dbfiddle.uk/…
  • 只是关于样式的一般说明,postgresql 中的对象名称(表、视图、函数、触发器等)不区分大小写除非用双引号括起来,否则带引号的名称被隐式转换为小写。在 postgresql 中最常见的样式是带下划线的不带引号的小写。
  • 更新了我的问题以修复虚假的 END IF,如前所述。对于那个很抱歉。我将尝试下面的答案,看看是否有帮助。

标签: postgresql


【解决方案1】:

eurotrashS-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

对于相同逻辑的更短的表达式(并且可能更快的评估)。

【讨论】:

  • 这解决了问题并简化了逻辑。完美的!谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 2021-01-01
  • 2021-07-23
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多