代码之家  ›  专栏  ›  技术社区  ›  Shawn

处理delete语句中找不到的记录,并在Postgres中返回json\u build\u对象

  •  0
  • Shawn  · 技术社区  · 7 年前

    我在postgres函数中遇到了一些问题,在该函数中,我删除一行并返回一个json\u build\u对象,而该行不存在。

    代码如下:

    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行。

    更新#1:

    select * from deletexjson(1);
    

    我得到以下信息:

     deletecampjson 
     ----------------
    
     (1 row)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Haleemur Ali    7 年前

    错误,正如 eurotrash S-Man 是流浪汉吗 END IF .

    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
    

    对于相同逻辑的较短表达式(可能更快的计算)。