Функции возврата набора не разрешены в UPDATE при использовании Postgres 11 - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть функция Postgresql 9.6 (и postgis 2.5), которая вычисляет json с параметрами, основанными на геометрии записи. Я создал поле json и записал там результат вычисления json, и все было хорошо.

UPDATE public.recordtable
SET polygoncalc = public.fn_calculate_polygon(5)
WHERE id = 5; 

Когда я пытаюсь запустить его на Postgres 11.2, он возвращает ошибку:

SQL Error [0A000]:ERROR: set-returning functions are not allowed in UPDATE

На основании этой ссылки Я понимаю, что в postgresql произошли изменения, но, честно говоря,

как я могу записать json в поле в Postgres 11.2 без получения ошибки?

Заранее спасибо.

РЕДАКТИРОВАТЬ: я изменил поле вывода на тип json и добавил текст функции

the function:

CREATE OR REPLACE FUNCTION public.fn_create_jsn_point(pid double precision)
 RETURNS TABLE(jsn json)
 LANGUAGE plpgsql
AS $function$
DECLARE
    p_id double precision = pid;
    myjson json = null ;

    begin
       return QUERY 
       select row_to_json(finaljson)
            from(
            select
                 ST_x(a.wgs_84_dump_point) as X,
                 ST_y(a.wgs_84_dump_point) as Y
                        (
                             select (st_transform(st_centroid(t.geom),4326))  wgs_84_dump_point
                                 from baserecords t where base_id = p_id                         
                        ) a ) finaljson;
    END;
$function$
;

1 Ответ

2 голосов
/ 16 февраля 2020

Функция возвращает таблицу. Независимо от того, сколько строк возвращено, оно возвращает таблицу, то есть набор.

Поскольку вы знаете, что будет возвращено одно значение, вы можете изменить функцию, чтобы ограничить его:

CREATE OR REPLACE FUNCTION public.fn_create_jsn_point(pid double precision)
 RETURNS json -- <---------------------------- Return a single value
 LANGUAGE plpgsql
AS $function$
DECLARE
    p_id double precision = pid;
    myjson json = null ;

    begin
       return ( -- <---------------------------------- return a single value
         select row_to_json(finaljson)
            from(
            select
                 ST_x(a.wgs_84_dump_point) as X,
                 ST_y(a.wgs_84_dump_point) as Y
                        (
                             select (st_transform(st_centroid(t.geom),4326))  wgs_84_dump_point
                                 from baserecords t where base_id = p_id                         
                        ) a ) finaljson
       );
    END;
$function$
;
...