Обработка записей не найдена в операторе удаления с возвратом json_build_object в Postgres - PullRequest
0 голосов
/ 01 октября 2018

У меня возникли проблемы с функцией 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 строк возвращалось, когда его не существует?Если есть способ лучше справиться с этим, дайте мне знать.

Обновление № 1:

Я исправил фиктивный END IF.Однако, если я запускаю это через psql:

select * from deletexjson(1);

, я получаю следующее:

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

 (1 row)

1 Ответ

0 голосов
/ 01 октября 2018

Ошибка, на которую указывают 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

для более короткого выражения (и, возможно, более быстрой оценки) той же логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...